我正在學習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」)文本出現,但我想關於這個問題的一些專家建議,因爲我只是一個初學者的語言。
你寫的第二種方法是什麼我通常使用安全解纏。我對_String!_類型的使用僅僅是一個實驗,目的是要找出這樣一個可選的行爲會在語句內如何表現。由於類型推斷爲您提供了一個_String_常量,因此我**已經明確地寫出類型;所以這是有意的。不管怎樣,謝謝你! – MustangXY
嗯...你是說盡管定義** apt **作爲一個隱式解包可選它不會解開自己,並且第一行只顯示解包自己,因爲結果窗格顯示代碼執行的方式? 在這種情況下,我仍然不明白爲什麼函數內的* String!*對象的行爲像這樣,而在接收相同返回值的操作系統文件頂層的* String!*對象正確解開println( ): 'let str2:String! = findApt(「404」); println(str2)' – MustangXY
如果您明確使用'String!',則不會展開可選項,該值仍然是可選的。 – aromero