iOS Swift Pass关闭属性?

时间:2014-06-13 02:46:51

标签: ios uitextfield closures swift uitextfielddelegate

假设我有一个自定义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中做到这一点?

1 个答案:

答案 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!")