我正在遵循The Swift Programming Language一书来研究强大的参考周期。其中一个应该工作的示例无法在Xcode中编译。我不明白为什么代码被破坏了。
在这个chapter上,有一个示例如下:
当我尝试在Xcode中编译此代码时,抛出了这个错误:' self'在所有存储的属性初始化之前使用。但是,我认为它应该能够编译,因为我将capitalCity设置为默认为nil的隐式解包Optionals,因此在设置 self.name = name 后,所有存储的属性都应该已经正确设置
我在这里想念什么?使代码编译需要进行哪些更改?
提前致谢!
答案 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