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()