使用 self 快速惰性实例化

标签 swift initialization lazy-initialization

我有一些真正让我困惑的事情,特别是以下代码触发编译器错误“无法解析的标识符自身”,我不确定为什么会发生这种情况,因为惰性意味着在使用该属性时,该类已经实例化了。我错过了什么吗?

提前非常感谢。

这是代码

class FirstClass {
    unowned var second: SecondClass

    init(second:SecondClass) {
        self.second = second
        print("First reporting for duty")
    }

    func aMethod() {
        print("First's method reporting for duty")
    }
}


class SecondClass {

    lazy var first = FirstClass(second: self)

    func aMethod() {
        first.aMethod()
    }
}

最佳答案

出于某种原因,如果惰性属性需要显式类型注释 初始值指的是selfswift-evolution mailing list 上提到了这一点,但是我无法解释为什么 必要的。

lazy var first: FirstClass = FirstClass(second: self)
//            ^^^^^^^^^^^^

您的代码按预期编译并运行。

这是另一个例子,说明问题的发生 也与 struct 一起使用,即它与子类化无关:

func foo(x: Int) -> Int { return x + 1 }

struct MyClass {
    let x = 1

    lazy var y = foo(0)            // No compiler error
    lazy var z1 = foo(self.x)      // error: use of unresolved identifier 'self'
    lazy var z2: Int = foo(self.x) // No compiler error
}

y的初始值不依赖于self,也不需要 类型注释。 z1/z2 的初始值取决于 self, 并且它仅使用显式类型注释进行编译。

更新:has been fixed在 Swift 4/Xcode 9 beta 3 中, 惰性属性初始值设定项现在可以在没有显式 self 和显式类型注释的情况下引用实例成员。 (感谢@hamish 的更新。)

关于使用 self 快速惰性实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43557817/

相关文章:

C++20 指定初始化器 char[]

c# - 如何在 C# 中创建一个 Lazy 属性,将 <this> 类的字符串属性作为参数传递给它?

swift - CATransform3DMakeTranslation 之后 NSButton 不可调用

c - 如何在一行中初始化一个复杂的 C 结构?

ruby-on-rails - ruby rails : Passing argument to singleton

c# - 我如何将惰性与初始化程序一起使用?

arrays - 具有惰性元素的数组

ios - UIImageView 上的宽度和高度 NSLayoutConstraints 不起作用

ios - Xcode 本地化 : Keep translation in sync with Storyboard

swift - 如何将 openssl 添加到 swift 项目