Как я могу сохранить массив функций для обратного вызова позже в массиве, например, в JavaScript? Любой и AnyObject не могут содержать функции с различными типами сигнатур методов.
Массив функций в Swift
Ответ 1
Вы можете использовать перечисление для ввода различных функций в массив, а затем извлечения функций с помощью переключателя.
enum MyFuncs {
case Arity0 ( Void -> Void )
case Arity2 ( (Int, String) -> Void)
}
func someFunc(n:Int, S:String) { }
func boringFunc() {}
var funcs = Array<MyFuncs>()
funcs.append(MyFuncs.Arity0(boringFunc))
funcs.append( MyFuncs.Arity2(someFunc))
for f in funcs {
switch f {
case let .Arity0(f):
f() // call the function with no arguments
case let .Arity2(f):
f(2,"fred") // call the function with two args
}
}
Ответ 2
Примечание: этот ответ предназначен для версий Swift версии 1.0 и ниже.
Функции с разными параметрами и типами возврата имеют другой тип, поэтому они не могут быть сохранены в массиве вместе. Они также не соответствуют протоколам Any или AnyObject.
Если у вас есть функции с одинаковыми параметрами, вы можете обойти это. Несмотря на то, что функции ниже возвращают кортеж Double и Int, они могут быть определены как () -> Any
типы функций.
func func1 () -> Int {
return 1
}
func func2 () -> (Double, Double){
return (2, 3)
}
var a: () -> Int = func1
var b: () -> (Double, Double) = func2
var arr: Array< () -> Any> = [a, b]
Ответ 3
С Swift 1.1 все типы функций соответствуют Any, поэтому вы можете удерживать функции в любом массиве.
func foo (str: String) -> Int {
return 1
}
func bar () -> (Double, Double){
return (2, 3)
}
var a: Any = foo
var b: Any = bar
var arr: Any = [a, b]
Ответ 4
Ниже приведен пример как с массивом, так и с словарем. Протестировано и работает в Xcode 6.1 (6A1046a). Обратите внимание, что функции из словарей должны быть сначала развернуты.
Этот метод, однако, разваливается, когда функции имеют разные параметры или типы возврата по причинам, объясняемым конрором в его ответе.
class MyViewController: UIViewController
{
let arrayOfFunctions = [function1, function2]
let dictionaryOfFunctions = [
"function1": function1,
"function2": function2
]
func function1() {
NSLog("function1")
}
func function2() {
NSLog("function2")
}
override func viewDidLoad()
{
let fn1 = arrayOfFunctions[0]
fn1(self)()
let fn2 = dictionaryOfFunctions["function2"]
fn2!(self)()
}
}