【问题标题】:Array of first-class functions as an instance variable in Swift第一类函数数组作为 Swift 中的实例变量
【发布时间】:2015-03-19 19:24:26
【问题描述】:

我在尝试创建存储函数数组的变量时遇到以下问题:

class MySwiftClass {

    // Compilation Error: '()' is not a subtype of 'MySwiftClass'
    var arrayOfFunctions: [() -> Int] = [myFunction] 

    func myFunction() -> Int {
        return 0
    }
}

实际上这段代码无法编译错误:

'()' 不是 'MySwiftClass' 的子类型

但是如果在运行时设置这个数组就可以了:

class MySwiftClass {
    var arrayOfFunctions: [() -> Int] = [() -> Int]()

    init() {
         arrayOfFunctions = [myFunction]
    }

    func myFunction() -> Int {
        return 0
    }
}

谁能解释这是 Swift 编译器的错误还是预期的行为?在第一种情况下,我没有看到任何编译错误的原因,而且错误描述对我来说是有意义的。

【问题讨论】:

    标签: swift compiler-errors first-class-functions


    【解决方案1】:

    这是 Swift 设计的。在运行init 之前,分配给属性的初始化程序(在您的情况下为arrayOfFunctions)无法访问self。在您的情况下,它正在尝试访问self.myFunction。您只能在init 方法中安全地访问self

    在“安全检查 4”中查看 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html

    【讨论】:

      【解决方案2】:

      正如@tng 所说,这是正确的,我想提出一个解决方案,它使用静态方法,如下所示:

      class MySwiftClass {
      
      
          var arrayOfFunctions: [() -> Int] = [MySwiftClass.myFunction]
      
          static func myFunction() -> Int {
              return 0
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-22
        • 1970-01-01
        • 2013-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 2017-07-15
        相关资源
        最近更新 更多