Swift Массивы однородны, но вы можете использовать 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 Runtime, поскольку он динамический, и вы можете использовать на самом делеиспользуйте execute селектор с аргументами для вызова селекторов, но я все еще не рекомендую его:
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.
}
}