我想定义闭包变量并在以后使用,该怎么办?

时间:2018-12-28 10:40:51

标签: swift closures protocols

下面,有一个协议具有两个闭包变量和一个函数。还有一个符合协议的类。

if (preg_match("[\b123\b|\b456\b]", $val) && (preg_match("[\bACB\b|\bZXY\b]", 
$val) ===1)){

我的预期结果是0、0、0、2。但是,当我定义闭包变量时,闭包变量会立即执行。我该怎么办?

1 个答案:

答案 0 :(得分:2)

问题在于您不是在定义闭包,而是在定义Void,这是因为您实际上是在定义闭包之后通过在闭包之后写()来执行闭包。 firstClosuresecondClosure的类型均为Void,这是()的类型别名。如果要声明一个不带输入参数且不返回值(或者返回Void)的闭包,则需要将其声明为() -> ()

protocol TestProtocol: class {
    var firstClosure: () -> () { get set }
    var secondClosure: () -> () { get set }
    func testFunction()
}

extension TestProtocol {
    func testFunction() {
        firstClosure()
        secondClosure()
    }
}

您还应该修改符合条件的类,以直接设置闭包的类,而不是在初始化程序中设置它们,并且不要在初始化程序中调用具有副作用(testFunction)的函数,而是在实际需要时调用它初始化后。您需要将闭包声明为lazy,因为它们访问self

class A: TestProtocol {
    var number = 0
    lazy var firstClosure: () -> Void = {
        self.number = 1
    }
    lazy var secondClosure: () -> Void = {
        self.number = 2
    }
}

A().testFunction()