Swift 中的隐式解包选项似乎不起作用

Implicitly Unwrapped Optionals in Swift does not seem to work

我正在阅读 Swift 编程语言一书来研究强引用循环。无法在 Xcode 中编译应该工作的示例之一。我不明白为什么代码被破坏了。

关于这个 chapter,有一个看起来像这样的例子:

当我尝试在 Xcode 中编译此代码时,抛出此错误:'self' 在所有存储的属性初始化之前使用 。但是,我认为它应该能够编译,因为我将 capitalCity 设置为默认情况下为 nil 的隐式解包选项,所以在我设置 self.name = name 之后所有存储的属性应该已经正确设置了。

我在这里想念什么?需要进行哪些更改才能编译代码?

提前致谢!

由于初始化器还没有设置对象,你不能用它初始化另一个对象。

您需要初始化城市,然后设置属性。

只需更改(let 为 var)

let capitalCity: City!

var capitalCity: City!

发生这种情况,可能是因为它不能是常量值,因为我们在初始化期间设置了它。

更新:

我不知道为什么我被否决了!。这是书中的例子,不编译。但是如果你像我说的那样把 let 改成 var,你就会成功!

谁能提供一个代码修改,让书中的代码可以编译!?

我只能承认我不应该写关于在初始化程序中设置 let 的内容,但我认为很明显我并不是说你不能在初始化程序中设置常规 let

let 语句没有将可选值默认初始化为 nil,因为否则写 let foo:Bar! 会给你一个总是 nil 的 foo 并且你无法初始化它在随后的声明中。

var 合适的原因是您希望默认初始化为 nil 以便您可以使用 self 引用初始化 City 对象,以便最终初始化您的实际 capitalCity 真正双重初始化的值。

该代码在设计上具有循环 class 依赖性,因此这是该设计的副作用。

let 的这种行为是 Swift 1.2 中的新行为,请尝试 Xcode 6.2 或更早版本中的示例,您会发现它可以编译。