2015-08-22 27 views
1

我正在學習Swift,對於隱式解包選項有疑問。隱式解包選項和println

我有一個函數返回可選的字符串:

func findApt(aptNumber :String) -> String? 
{ 
    let aptNumbers = ["101", "202", "303", "404"] 
    for element in aptNumbers 
    { 
     if (element == aptNumber) 
     { 
      return aptNumber 
     } 
    } // END OF for LOOP 
    return nil 
} 

和if語句來執行安全解纏,它採用隱式無包裝可選的,因爲它的常數:

if let apt :String! = findApt("404") 
{ 
    apt 
    println(apt) 
    println("Apartment found: \(apt)") 
} 

在第一行易於解開本身,因爲它應該(結果窗格顯示「404」),但在另兩個線易於不展開:結果窗格和控制檯都顯示打印值爲可選(「404」)找到的公寓:可選(「404」),並且出現在控制檯上我必須使用!符號,如果我理解正確,只需手動打開常規選項即可。

爲什麼發生?

我的猜測是,傳遞給println()時,容易被隱式地從隱無包裝可選轉換爲常規選項,這將導致可選(「404」)文本出現,但我想關於這個問題的一些專家建議,因爲我只是一個初學者的語言。

回答

2
因爲你明確地使用可選的類型如果你想解開可選的使用是 String!

let apt :String! = findApt("404")不會拆開包裝可選:

if let apt: String = findApt("404") 
{ 
    ... 
} 

或更好,使用類型推斷:

if let apt = findApt("404") 
{ 
    ... 
} 

在第一行解開自己,因爲它應該(重新顯示爲「404」),但在另外兩行中不包括: 結果窗格和控制檯顯示打印值爲 可選(「404」)和找到的公寓:可選(「404」 ),並且爲了讓 404出現在控制檯上,我必須使用!符號,如果我能正確理解,只需手動打開常規 選項即可。

爲什麼發生?

這就是控制檯/遊樂場如何顯示價值。在您的代碼示例中,apt仍然是Optional

您可以檢查在使用dynamicType運行時類型,即println(apt.dynamicType)

+0

你寫的第二種方法是什麼我通常使用安全解纏。我對_String!_類型的使用僅僅是一個實驗,目的是要找出這樣一個可選的行爲會在語句內如何表現。由於類型推斷爲您提供了一個_String_常量,因此我**已經明確地寫出類型;所以這是有意的。不管怎樣,謝謝你! – MustangXY

+0

嗯...你是說盡管定義** apt **作爲一個隱式解包可選它不會解開自己,並且第一行只顯示解包自己,因爲結果窗格顯示代碼執行的方式? 在這種情況下,我仍然不明白爲什麼函數內的* String!*對象的行爲像這樣,而在接收相同返回值的操作系統文件頂層的* String!*對象正確解開println( ): 'let str2:String! = findApt(「404」); println(str2)' – MustangXY

+3

如果您明確使用'String!',則不會展開可選項,該值仍然是可選的。 – aromero