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

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,因为您在定义闭包后立即执行闭包,方法是在闭包后写入 ()firstClosuresecondClosure的类型都是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()