成员操作符“%”必须至less有一个types为“ViewController”的参数

我试图创build一个简单的Swift 3模板与自定义函数计算百分比使用Xcode应用程序中的后缀一元运算符。 这可能看起来像一个重复的问题,因为在我以前的post中接受的答案已经显示了如何在Playground中做到这一点。 但是我发现自定义函数在Xcode项目中的工作方式不同。

下面的模板 ,我'operator' at file scope (或者至less我相信我做过)声明了'operator' at file scope 。 但是当声明后缀函数时,Xcodebuild议

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

并提供修复它插入staticstatic插入Xcode然后build议

  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) } } 

EDITED模板

这是基于接受的答案的工作模板。 我不明白什么是在文件范围声明操作符。

 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) } } 

脚注

在接受的答案的基础上,现在可以从同一个项目中的其他文件访问定制操作员函数分组在单个文件中。 在这里看到更多的访问。

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

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

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

可以将运算符定义为Swift 3types的静态成员函数,但前提是它们至less需要一个types的参数。

将声明移到文件范围来解决问题:

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

其他的select如果你想在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 { //... } 

Eidhof,Chris; 库格勒,弗洛里安; Swierstra,Wouter。 function迅捷:更新为Swift 3(Kindle位置542)。 GbR Florian Kugler&Chris Eidhof。 Kindle版。