不确定这是否是最好的方法,但是我想让索引可以访问函数,并且不希望使用字典。所以我正在考虑将它们放入数组。
var array = [ func1, func2, ... ]
由于函数是一等公民,因此这似乎是可能的。
但是,我想知道您是否可以在课堂上这样做。也就是说,将函数从类实例传递到数组,而不会因额外的闭包而损失性能。
class Foo {
var array: [Function]
init() {
array = [ f1, f2 ]
}
func f1() {
return array.length
}
func f2(a: Int, b: Int) {
// ... the functions are all different.
}
}
想知道是否有可能这样做。
答案 0 :(得分:2)
快速数组是同构的,但是您可以使用Any
来装箱任何类型,但会丢失类型信息,因此,是的,即使它们具有不同的类型,也可以将所有函数粘贴到单个数组中。我并不特别认为这是个好主意,但实际上确实有效:
import UIKit
import PlaygroundSupport
class Foo {
var array: [Any] = []
init() {
array = [ f1, f2 ]
}
func f1() -> Int {
return array.count
}
func f2(a: Int, b: Int) {
// ... the functions are all different.
}
}
如果使用Objective C运行时,这也许不太可怕,因为它是动态的,您可以使用带有参数的perform选择器来调用选择器,但是我仍然不建议这样做:< / p>
import UIKit
import PlaygroundSupport
class Foo {
var array: [Selector] = []
init() {
array = [#selector(f1), #selector(f2) ]
}
@objc func f1() -> Int {
return array.count
}
@objc func f2(a: Int, b: Int) {
// ... the functions are all different.
}
}
编辑:
选项3,带有关联值的枚举(出现比我这里更有意义的名称):
import UIKit
import PlaygroundSupport
class Foo {
enum Function {
case void_Int(() -> Int)
case intInt_Void((Int,Int) -> Void)
}
var array: [Function] = []
init() {
array = [.void_Int(f1), .intInt_Void(f2) ]
}
@objc func f1() -> Int {
return array.count
}
@objc func f2(a: Int, b: Int) {
// ... the functions are all different.
}
}