gpt4 book ai didi

使用 self 进行 Swift 惰性实例化

转载 作者:IT王子 更新时间:2023-10-29 05:23:28 25 4
gpt4 key购买 nike

我有一些事情真的让我很困惑,特别是下面的代码触发了一个编译器错误“unresolved identifier self”,我不确定为什么会这样,因为懒惰意味着在使用属性时,类已经实例化了。我错过了什么吗?

非常感谢。

这是代码

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)
// ^^^^^^^^^^^^

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

这是证明问题发生的另一个例子也与 structs,即它与子类化无关:

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,也不需要a类型注解。 z1/z2的初始值取决于self,并且它仅使用显式类型注释进行编译。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com