下面,有一个协议具有两个闭包变量和一个函数。还有一个符合协议的类。
if (preg_match("[\b123\b|\b456\b]", $val) && (preg_match("[\bACB\b|\bZXY\b]",
$val) ===1)){
我的预期结果是0、0、0、2。但是,当我定义闭包变量时,闭包变量会立即执行。我该怎么办?
答案 0 :(得分:2)
问题在于您不是在定义闭包,而是在定义Void
,这是因为您实际上是在定义闭包之后通过在闭包之后写()
来执行闭包。 firstClosure
和secondClosure
的类型均为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()