Swift类:使用指向成员函数的闭包声明变量

时间:2018-06-24 21:55:59

标签: swift initialization closures

在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)->()'

我做错了什么? 预先感谢

2 个答案:

答案 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