【问题标题】:Swift class: declare variables with closures pointing to member functionsSwift 类:用指向成员函数的闭包声明变量
【发布时间】:2018-06-25 06:06:50
【问题描述】:

在 xcode10 beta 中使用 swift 4.2

我正在尝试创建一个 swift 类,将其存储为一个字段,一个指向该类成员函数的闭包。

这个想法是策略模式的一种变体。我希望能够更改在运行时调用的函数。在此示例中,公共 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)
    }
}

我的问题来自初始化。在上面的示例中,编译器抱怨: _'self' 在所有存储属性初始化之前用于方法调用'f_release'_

我尝试使用默认值初始化 aFunc 变量来解决替换行的问题

    var aFunc: (Int) -> ()

带线

    var aFunc: (Int) -> () = f_release

但是对于这种情况,编译器现在抱怨: 无法将类型 '(MyClass) -> (Int) -> ()' 的值转换为指定类型 '(Int) -> ()'

我做错了什么? 提前致谢

【问题讨论】:

    标签: swift initialization closures


    【解决方案1】:

    在初始化器中分配值不起作用,因为您试图将实例属性(或特定情况下的函数)分配给另一个实例属性,但在初始化器中,它们都不能保证被初始化。

    您可以通过将 aFunc 声明为惰性来解决您的问题。你也不再需要初始化器了。

    lazy var aFunc: (Int) -> () = f_release
    

    【讨论】:

      【解决方案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)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        相关资源
        最近更新 更多