swift - 如何在 Swift 的惰性初始化中使用 self

标签 swift

一些网站建议使用惰性初始化而不是 Storyboard来初始化 View 。

self 没有被用于惰性初始化时它起作用。 但是其中使用self时,会出现编译错误。

比如下面的代码中,label1可以编译成功,但是label2不能,因为里面使用了self .

如何在惰性初始化中使用self

class A {
    private let label1: UILabel = {
        return UILabel()
    }()

    private let label2: UILabel = {
        let view = UILabel()
        self.addTextToLabel(view) // compile error !!!
        return view
    }()

    private func addTextToLabel(label: UILabel) {
        label.text = "test"
    }
}

最佳答案

你的问题是在你目前使用惰性初始化的误解下写的。但你不是。 label1label2 都没有使用惰性初始化。当 A 被初始化时,它们会立即被初始化,这是错误的原因,因为当调用这些属性初始化器时 self 还没有准备好。

解决方案实际上是使 label2 成为惰性属性。

private lazy var label2: UILabel = {
    let view = UILabel()
    self.addTextToLabel(label: view)
    return view
}()

但请注意,只有在您第一次实际尝试访问 label2 属性时才会发生此 label2 初始化。

根据文档:

A lazy stored property is a property whose initial value is not calculated until the first time it is used. You indicate a lazy stored property by writing the lazy modifier before its declaration.

Lazy properties are useful when the initial value for a property is dependent on outside factors whose values are not known until after an instance’s initialization is complete.

引用: https://docs.swift.org/swift-book/LanguageGuide/Properties.html

关于swift - 如何在 Swift 的惰性初始化中使用 self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52463359/

相关文章:

ios - 如何在 tableview 中保持图像大小?

Xcode/AppCode 中的 IOS Swift 调试 - 我无法查看我的字典内容

swift - swift服务器中的同步或异步(完美)

swift - Swift 语言中的 Ctrl

ios - 如何对已重命名的方法使用@available?

ios - SwiftR 调用方法回调处理程序

uitableview - TableViewController 中的 TabBar 不在底部

ios - Swift:无法使带有部分的表中带有标识符的单元格出队

Swift SpriteKit,不能多次发射子弹

ios - 如何停止跳转到下一个 View Controller ? ( swift )