我正在尝试创建一个简单的Swift 3模板,其中包含一个自定义函数,用于在Xcode应用程序中使用postfix一元运算符计算百分比。这似乎是一个重复的问题,因为我之前的帖子中的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’.
任何人都可以解释为什么{1}}函数需要在Xcode项目中%
以及最后一条错误消息在同一行的上下文中意味着什么(见下文 )?感谢
草稿模板
static
EDITED模板
这是基于接受的答案的工作模板。我没有理解在文件范围内声明操作符的含义。
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)
}
}
FOOTNOTE
在已接受的答案的基础上,现在可以从同一项目中的其他文件访问分组在单个文件中的自定义操作员功能。要查看更多信息,请访问here。
答案 0 :(得分:9)
我宣布'运营商'在文件范围
不,你没有。你在它的范围内定义了它
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 {
// ...
}
答案 1 :(得分:1)
其他替代方案
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。功能性Swift:针对Swift 3(Kindle Location 542)进行了更新。 GbR Florian Kugler&克里斯艾德霍夫。 Kindle版。