作为Swift中的实例变量的第一类函数的数组

时间:2015-03-19 19:24:26

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

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

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编译器的错误还是预期的行为?在第一种情况下我没有看到编译错误的任何原因,而且错误描述对我来说是有意义的。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

class MySwiftClass {


    var arrayOfFunctions: [() -> Int] = [MySwiftClass.myFunction]

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