Подтвердить что ты не робот

Массив функций в Swift

Как я могу сохранить массив функций для обратного вызова позже в массиве, например, в JavaScript? Любой и AnyObject не могут содержать функции с различными типами сигнатур методов.

4b9b3361

Ответ 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)()
    }
}