簡體   English   中英

在Swift中隱式解開Optionals似乎不起作用

[英]Implicitly Unwrapped Optionals in Swift does not seem to work

我正在研究《快速編程語言》這本書,以研究強大的參考周期。 無法正常工作的示例之一無法用Xcode編譯。 我不明白為什么代碼被破壞了。

本章中 ,有一個示例如下所示:

這個例子不會在Xcode中編譯

當我嘗試在Xcode中編譯此代碼時,拋出此錯誤: 在初始化所有存儲的屬性之前使用了'self' 但是,我認為它應該能夠編譯,因為我將capitalCity設置為默認情況下為nil隱式解包Optionals,因此在設置self.name = name之后,所有存儲的屬性都應已正確設置。

我在這里想念什么? 需要進行哪些更改才能使代碼編譯?

提前致謝!

let語句沒有將可選的默認初始化初始化為nil,因為否則編寫let foo:Bar! 會給你一個永遠為零的foo ,而你不能在隨后的語句中初始化它。

var之所以合適,是因為您希望默認初始化為nil發生,以便您可以使用self引用初始化City對象,以便最終初始化您的實際capitalCity值,這實際上是兩次初始化。

該代碼在設計上具有循環類依賴關系,因此這是該設計的副作用。

let這種行為在Swift 1.2中是新的,請在Xcode 6.2或更早版本中嘗試該示例,您會發現它可以編譯。

由於初始化程序尚未設置該對象,因此無法使用該對象初始化另一個對象。

您需要初始化城市,然后設置屬性。

只需更改(將其更改為var)

let capitalCity: City!

var capitalCity: City!

之所以會發生這種情況,可能是因為它不能為恆定值,因為我們在初始化期間進行了設置。

更新:

我不知道為什么我被否決! 這是本書中的示例,無法編譯。 但是,如果您按照我說的那樣將var更改為var,就可以使用它!

誰可以在這里提供代碼修改,以便可以編譯THE BOOK中的代碼!

我只能承認我不應該寫關於在初始化程序中設置let的文章,但是我認為很明顯,我並不是說您不能在初始化程序中設置常規let。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM