我想定义闭包变量并在以后使用它们,我该怎么做?
I want to define closure variables and use them later, How do I do?
下面是一个协议,它有两个闭包变量和一个函数。而且还有一个class符合协议的
import Foundation
protocol TestProtocol: class {
var firstClosure: () -> () { get set }
var secondClosure: () -> () { get set }
func testFunction()
}
extension TestProtocol {
func testFunction() {
_ = firstClosure
_ = secondClosure
}
}
class A: TestProtocol {
var firstClosure: () -> ()
var secondClosure: () -> ()
var number = 0
init() {
print(number)
firstClosure = {
self.number = 1
}()
print(number)
secondClosure = {
self.number = 2
}()
print(number)
testFunction()
print(number)
}
}
let a = A()
我的预期结果是 0, 0, 0, 2。但是,当我定义闭包变量时,闭包变量立即执行。我该怎么办?
问题是您没有定义闭包,而是定义了 Void
,因为您在定义闭包后立即执行闭包,方法是在闭包后写入 ()
。 firstClosure
和secondClosure
的类型都是Void
,这是()
的类型别名。如果你想声明一个不带输入参数且 returns 没有值(或者更确切地说 returns Void
)的闭包,你需要将其声明为 () -> ()
.
protocol TestProtocol: class {
var firstClosure: () -> () { get set }
var secondClosure: () -> () { get set }
func testFunction()
}
extension TestProtocol {
func testFunction() {
firstClosure()
secondClosure()
}
}
您还应该修改符合要求的 class 以直接设置闭包而不是在初始化程序中设置它们,并且不在初始化程序中调用具有副作用 (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()
下面是一个协议,它有两个闭包变量和一个函数。而且还有一个class符合协议的
import Foundation
protocol TestProtocol: class {
var firstClosure: () -> () { get set }
var secondClosure: () -> () { get set }
func testFunction()
}
extension TestProtocol {
func testFunction() {
_ = firstClosure
_ = secondClosure
}
}
class A: TestProtocol {
var firstClosure: () -> ()
var secondClosure: () -> ()
var number = 0
init() {
print(number)
firstClosure = {
self.number = 1
}()
print(number)
secondClosure = {
self.number = 2
}()
print(number)
testFunction()
print(number)
}
}
let a = A()
我的预期结果是 0, 0, 0, 2。但是,当我定义闭包变量时,闭包变量立即执行。我该怎么办?
问题是您没有定义闭包,而是定义了 Void
,因为您在定义闭包后立即执行闭包,方法是在闭包后写入 ()
。 firstClosure
和secondClosure
的类型都是Void
,这是()
的类型别名。如果你想声明一个不带输入参数且 returns 没有值(或者更确切地说 returns Void
)的闭包,你需要将其声明为 () -> ()
.
protocol TestProtocol: class {
var firstClosure: () -> () { get set }
var secondClosure: () -> () { get set }
func testFunction()
}
extension TestProtocol {
func testFunction() {
firstClosure()
secondClosure()
}
}
您还应该修改符合要求的 class 以直接设置闭包而不是在初始化程序中设置它们,并且不在初始化程序中调用具有副作用 (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()