【问题标题】:Member operator '%' must have at least one argument of type 'ViewController’成员运算符“%”必须至少有一个类型为“ViewController”的参数
【发布时间】:2016-12-02 12:25:56
【问题描述】:

我正在尝试创建一个简单的 Swift 3 模板,其中包含一个自定义函数,用于在 Xcode 应用程序中使用后缀一元运算符计算百分比。这似乎是一个重复的问题,因为我之前的帖子中的accepted answer 已经展示了如何在 Playground 中执行此操作。但后来我发现自定义函数在 Xcode 项目中的工作方式不同。

在模板下面中,我声明了’operator' at file scope(或者至少我相信我这样做了)。但是当声明后缀函数时,Xcode 建议

    Operator '%' declared in type 'ViewController' must be 'static' 

并提供了一个修复它来插入static。使用 static 插入 Xcode 然后建议

    Member operator '%' must have at least one argument of type 'ViewController’.

谁能解释为什么 Xcode 项目中的 % 函数必须是 static 以及同一行上下文中最后一条错误消息的含义(见下文)?谢谢

草稿模板

import UIKit

postfix operator %

class ViewController: UIViewController {

var percentage = Double()

override func viewDidLoad() {
    super.viewDidLoad()

    percentage = 25%
    print(percentage)
    }

static postfix func % (percentage: Int) -> Double {
    return (Double(percentage) / 100)
    }
}

已编辑模板

这是基于已接受答案的工作模板。我不明白在文件范围内声明运算符是什么意思。

import UIKit


postfix operator %

postfix func % (percentage: Int) -> Double {
return (Double(percentage) / 100)
}


class ViewController: UIViewController {

var percentage = Double()

override func viewDidLoad() {
    super.viewDidLoad()

    percentage = 25%
    print(percentage)
    }
}

脚注

基于已接受的答案,现在可以从同一项目中的其他文件访问分组在单个文件中的自定义运算符函数。要查看更多信息,请访问here

【问题讨论】:

    标签: ios swift xcode swift3


    【解决方案1】:

    我在文件范围内声明了“操作员”

    不,你没有。您在范围内定义了它 UIViewController定义:

    postfix operator %
    
    class ViewController: UIViewController {
    
        // ...
    
        static postfix func % (percentage: Int) -> Double {
            return (Double(percentage) / 100)
        }
    }
    

    可以将运算符定义为 Swift 3 中某个类型的静态成员函数, 但前提是它们至少采用该类型的一个参数。

    将声明移至文件范围以解决问题:

    postfix operator %
    
    postfix func % (percentage: Int) -> Double {
        return (Double(percentage) / 100)
    }
    
    class ViewController: UIViewController {
    
        // ...
    
    }
    

    【讨论】:

    • 我还尝试将函数移动到文件范围,如您所建议的那样,它不再是静态的。这次我对其进行了测试,它可以确认您的答案。谢谢。
    • 您可能对使用静态后缀函数的解决方案感兴趣。无论如何,我从你的意见中学到了很多。谢谢。见最终编辑stackoverflow.com/questions/40941827/…
    【解决方案2】:

    如果您想在 Swift 3 中使用闭包,还有其他选择:

    import UIKit
    
    typealias Filter = (CIImage) -> CIImage
    
    infix operator >>>
    func >>> (filter1: @escaping Filter, filter2: @escaping Filter) -> Filter{
        return { image in
            filter2( filter1( image))
        }
    }
    
    class ViewController: UIViewController {
        //...
    }
    

    艾德霍夫,克里斯;库格勒,弗洛里安;斯韦斯特拉,沃特。功能性 Swift:针对 Swift 3(Kindle 位置 542)进行了更新。 GbR Florian Kugler 和 Chris Eidhof。 Kindle版。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 2016-06-12
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多