Swift:闭包作为类变量中的初始参数

标签 swift closures init

我有一些代码看起来像这样:

class Calculator {
    private let estimateChanged:(newEstimate:Double) -> Void

    init(_ estimateChanged:(newEstimate:Double) -> Void) {
        self.estimateChanged = estimateChanged
    }
}

被另一个类使用。目前我正在尝试设置一个包含计算器的属性:

class AnotherClass {
    private lazy var calculator = Calculator({ [unowned self] in
        self.loadEstimate()
    })
    func loadEstimate() {}
}

我遇到了错误。首先它说 [unowned self] 给我错误:'unowned' cannot be applied to non-class type 'AnotherClass -> () -> AnotherClass'

其次在 self.loadEstimate() 上我得到:value of type 'AnotherClass -> () -> AnotherClass' has no member 'loadEstimate'

我读过的所有内容都向我表明我做对了,但是我还没有看到任何使用闭包作为初始参数的类实例设置 var 的示例。

有没有人这样做过或知道接下来要尝试什么?或者有更好的方法吗?

附带说明一下,此代码的目标是有效地为 Calculator 类提供一种在值更改时通知 AnotherClass 的方法。我环顾四周,但不确定哪种技术最适合执行此操作。有什么建议吗?

最佳答案

我可以通过在 Playground 上摆弄来尽可能接近你想要的东西。我必须更改类型以匹配您传递给计算器的内容

class Calculator {
    private let estimateChanged:() -> Void

    init(_ estimateChanged:() -> Void) {
        self.estimateChanged = estimateChanged
    }
}

class AnotherClass {
    lazy var callback: () -> Void = { [unowned self] in
        self.loadEstimate()
    }
    var calculator: Calculator?

    // viewDidLoad in the case of a view controller
    init() {
        calculator = Calculator(callback)
    }

    func loadEstimate() {}
}

这显然不是您想要的,但可以编译。尝试在未初始化的对象中引用 self 时似乎存在问题(即使您似乎应该能够这样做,因为您指定了 lazy 和 weak 或 unowned 等)

关于Swift:闭包作为类变量中的初始参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33757443/

相关文章:

ios - 如何在 Today 扩展中发送和接收数据

ios - 如何从 iOS 设备获取硬件采样率?

ios - 从 SKAction 播放音乐

objective-c - 我在哪里可以找到关于 Objective-C block 的很好的介绍或文档?

swift - 在子类中使用 init

ios - SpriteKit : Rotating SKNode falls off screen when adding another physics body

swift - 如何让 For 循环在迭代到下一个元素之前等待回调?

javascript - 如果一个 javascript 变量位于类之外,但位于模块的闭包内,它是私有(private)的吗?

android - Ice Cream Sandwich init.rc 文档

swift - 使用空变量初始化结构体并使其全局可用