Ответ 1
Конечно, вы можете это сделать. У Swift есть функции первого класса, поэтому вы можете делать такие вещи, как прямые функции пропуска, подобные переменным. Имейте в виду, что сами функции фактически закрываются за кулисами. Вот базовый пример:
class MyClass {
var theClosure: (() -> ())?
init() {
self.theClosure = aMethod
}
func aMethod() -> () {
println("I'm here!!!")
}
}
let instance = MyClass()
if let theClosure = instance.theClosure {
theClosure()
}
instance.theClosure = {
println("Woo!")
}
instance.theClosure!()
И вот тот же пример с использованием замыканий, которые могут принимать параметр String.
class MyClass {
var theClosure: ((someString: String) -> ())?
init() {
self.theClosure = aMethod
}
func aMethod(aString: String) -> () {
println(aString)
}
}
let instance = MyClass()
if let theClosure = instance.theClosure {
theClosure(someString: "I'm the first cool string")
}
instance.theClosure = {(theVerySameString: String) -> () in
println(theVerySameString)
someThingReturningBool()
}
instance.theClosure!(someString: "I'm a cool string!")