假设我有一个自定义UIView,我们称之为MyCustomView。在这个视图中是一个UITextField属性。假设我的目标是能够创建一个MyCustomView实例并将其添加到某个视图控制器,我希望该视图控制器能够处理对该文本字段采取的操作。例如,如果我在文本字段中点击键盘上的“return”,我可能想要做一些动作 - 让我举一个例子来说明我想象的一些Objective-c伪代码:
MyCustomView *myView = [[MyCustomView alloc] initWithFrame:CGRectMake(10,10,100,100)];
myView.textField.actionBlock = { /* do stuff here! */ }
[self.view addSubview:myView];
然后在MyCustomView类中,我会做类似的事情:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
self.actionBlock();
return NO;
}
我希望customView成为UITextFieldDelegate,这样每次我这样做时,我都不必将所有委托方法添加到我正在添加它的视图控制器中,而是只有一个实现只是是 无论 我传递给它...如何在swift中做到这一点?
答案 0 :(得分:39)
当然,你可以这样做。 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!")