Swift 我想定义闭包变量并在以后使用它们,我该怎么做?
下面是一个协议,它有两个闭包变量和一个函数。还有一个类符合协议Swift 我想定义闭包变量并在以后使用它们,我该怎么做?,swift,closures,protocols,Swift,Closures,Protocols,下面是一个协议,它有两个闭包变量和一个函数。还有一个类符合协议 import Foundation protocol TestProtocol: class { var firstClosure: () -> () { get set } var secondClosure: () -> () { get set } func testFunction() } extension TestProtocol { func testFunction()
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。但是,当我定义闭包变量时,闭包变量会立即执行。我该怎么办?问题在于,您不是在定义闭包,而是在定义空洞,因为您在定义闭包后立即通过在闭包后写入来执行闭包。firstClosure和secondClosure的类型都是Void,这是的typealias。如果您想要声明一个不接受输入参数、不返回值或返回Void的闭包,那么需要将其声明为-> 您还应该修改一致性类,以直接设置闭包,而不是在初始值设定项中设置闭包,并且不在初始值设定项中调用具有副作用的函数testFunction,而是在初始化后实际需要时调用它。您需要将闭包声明为惰性闭包,因为它们可以访问self
请不要张贴图片。发布文本。为什么你认为你的预期结果应该是02?你能解释一下吗?@AbhishekJadhav我只想把右值放到左变量中。并在testFunction上执行。所以,我希望如此。->Void而不是->更可取。我这样修改了。协议测试协议:类{var firstClosure:->Void{get set}var secondClosure:->Void{get set}func testFunction}。。。。。。init{printnumber firstClosure={self?.number=1}printnumber secondClosure={self?.number=2}printnumber testFunction printnumber}让a=a,但发生编译错误。为什么?初始化前使用的变量“self.firstClosure”
protocol TestProtocol: class {
var firstClosure: () -> () { get set }
var secondClosure: () -> () { get set }
func testFunction()
}
extension TestProtocol {
func testFunction() {
firstClosure()
secondClosure()
}
}
class A: TestProtocol {
var number = 0
lazy var firstClosure: () -> Void = {
self.number = 1
}
lazy var secondClosure: () -> Void = {
self.number = 2
}
}
A().testFunction()