2016-11-30 58 views
2

我無法理解串插在斯威夫特3.如何工作這裏有兩個變量,可選x和隱含展開可選y:這兩自選的爲什麼我應該解包隱式解包可選?

let x: Int? = 1 
let y: Int! = 2 

印刷看起來相當的邏輯:

print(x) // Optional(1) 
print(y) // 2 

但爲什麼字符串插值以其他方式工作?

print("x: \(x)") // x: Optional(1) 
print("y: \(y)") // y: Optional(2) 

爲什麼要打開已經打開的可選項?

print("y: \(y!)") // y: 2 

假設這裏被用來使用description屬性Int!轉換爲StringCustomStringConvertible協議。但爲什麼這裏沒有y: Optional(2)

print("y: \(y!.description)") // y: 2 
print("y: \(y?.description)") // y: Optional("2") 
print("y: \(y.description)") // y: 2 

任何人都可以請解釋嗎?

回答

1

print,作爲其內部工作的一部分,展開可選項(定期,不包裝類型)。字符串插值不會爲你做這件事,它只是轉換你給它的任何東西。

這裏的最後一個實例說明:

  • print("y: \(y!.description)") // y: 2

    y有一個類型Int!,這是明確的展開,給予其Int內容。 description被調用。 description返回String。如果y爲零,則會崩潰。

  • print("y: \(y?.description)") // y: Optional("2")

    可選鏈接被用來調用descriptiony只有如果它是不爲零。如果它是nil,則說明不首先被調用,並且傳播nil。這個表達式的結果是String?

  • print("y: \(y.description)") // y: 2

    樣病例1,y開始作爲Int!,但這次隱含展開,給予其Int內容。 description被調用。 description返回String。如果y爲零,則會崩潰。

+1

感謝您的回答,關於第二種情況下'String?'的好處。然而,它並沒有解釋爲什麼'print(「y:\(y)」)'給出'y:Optional(2)'。編輯:重複的標記 – Leo

+1

這是類型系統的一個缺點,正如這個鏈接到的另一個問題所述。希望它得到修復,但我不會因此失眠。只是不要使用隱式解包選項。除了IBOutlets和遞歸關閉之外,他們幾乎沒有任何理由。 – Alexander

+0

有一些原因,主要是因爲Obj-C和Swift的交互。對我而言,這是「初始化期間不能確定的常量」。但是,SE-0054真正將「隱含解包的選擇權」轉變爲「薛定諤自由選擇權」。 – Leo

相關問題