在xcode10 beta中使用Swift 4.2
我正在尝试创建一个快速的类,该类将存储为字段,该闭合将指向该类的成员函数。
这个想法是对战略模式的一种改变。我希望能够更改在运行时调用的功能。在此示例中,公共f()函数调用内部闭包。闭包应该存储f_release或f_debug,后者稍后仅添加一些调试打印语句:
class MyClass {
var n:Int = 0
var aFunc: (Int) -> ()
init() {
aFunc = f_release
}
public func f(number:Int) {
aFunc(number)
}
func f_release(number:Int) {
n = n + number
}
func f_debug(number:Int) {
print(n)
f_release(number:number)
print(n)
}
}
我的问题来自初始化。在上面的示例中,编译器抱怨: 在初始化所有存储的属性之前,在方法调用“ f_release”中使用_'self'_
我尝试用默认值初始化aFunc变量来解决替换行的问题
var aFunc: (Int) -> ()
带线
var aFunc: (Int) -> () = f_release
但是对于这种情况,编译器现在抱怨: 不能将类型'((MyClass)->(Int)->()'的值转换为指定的类型'(Int)->()'
我做错了什么? 预先感谢
答案 0 :(得分:2)
尝试一下:
class MyClass {
var n:Int = 0
lazy var aFunc: (Int) -> () = f_release
public func f(number:Int) {
aFunc(number)
}
func f_release(number:Int) {
n = n + number
}
func f_debug(number:Int) {
print(n)
f_release(number:number)
print(n)
}
}
答案 1 :(得分:1)
在初始化器中分配值无法工作,因为您试图将一个实例属性(或您的特定情况下的函数)分配给另一个实例属性,但是在初始化器中,不能保证它们都不被初始化。 >
您可以通过将aFunc
声明为惰性来解决您的问题。您也不需要初始化器。
lazy var aFunc: (Int) -> () = f_release