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

时间:2015-05-28 21:11:25

标签: ios xcode swift optional

我正在遵循The Swift Programming Language一书来研究强大的参考周期。其中一个应该工作的示例无法在Xcode中编译。我不明白为什么代码被破坏了。

在这个chapter上,有一个示例如下:

This example won't compile in Xcode

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

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

提前致谢!

3 个答案:

答案 0 :(得分:4)

let语句没有将选项的默认初始化设置为nil,因为否则编写let foo:Bar!会给你一个始终为零的foo并且你无法在随后的陈述。

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

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

let的这种行为在Swift 1.2中是新的,尝试在Xcode 6.2或更早版本中的示例,你会发现它编译。<​​/ p>

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

Just Change(let to var)

let capitalCity: City!

var capitalCity: City!

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

<强>更新

我不知道为什么我被投了票!这是本书的例子,不编译。但是,如果按照我的说法改变let to var,你就可以使它工作了!

谁可以在这里提供代码修改,以便编写FROM THE BOOK代码!?

我只能承认我不应该写关于在初始化程序中设置let,但我认为很明显我并不意味着你不能设置常规let in initialiser