在Swift中隐式展开的Optionals似乎不起作用

我遵循Swift编程语言手册来调查强大的参考周期。 其中一个应该工作的例子不能在Xcode中编译。 我不明白为什么代码被破坏。

在本章中 ,有一个例子是这样的:

这个例子不会在Xcode中编译

当我尝试在Xcode中编译这段代码时,会抛出这个错误: 在所有存储的属性被初始化之前使用“self” 。 但是,我认为它应该能够编译,因为我设置capitalCity为默认为零的隐式解包选项,所以在设置self.name = name之后,所有存储的属性都应该已经设置好了。

我在这里错过什么? 编译代码需要做什么修改?

提前致谢!

let语句没有默认初始化的可选项为零,否则写let foo:Bar! 会给你一个永远是零的foo ,你不能在随后的语句中初始化它。

var适当的原因是你想要默认初始化为零,所以你可以用自引用初始化你的City对象,以便最终初始化你的实际的capitalCity值,这是真正的双重初始化。

代码有一个循环的类依赖devise,所以这是该devise的副作用。

let这种行为在Swift 1.2中是新的,在Xcode 6.2或更早的版本中尝试一下例子,你会发现它编译。

由于初始化程序尚未设置对象,因此不能用它初始化另一个对象。

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

只是改变(让var)

 let capitalCity: City! 

 var capitalCity: City! 

这可能发生,因为它不能是一个常量值,因为我们在init中设置它。

更新:

我不知道为什么我被投票! 这是本书的例子,并没有编译。 但是,如果你像我说的那样改变var的话,你就会得到它的工作!

谁可以在这里提供代码修改,以便编译代码可以编译!?

我只能承认,我不应该写关于设置初始化程序的设置,但我认为这并不意味着你不能设置定期初始化程序