我的印象是,隱式解包可選將在使用時導致運行時異常,且爲零。但是下面的代碼沒有運行時異常,爲什麼?隱式解包可選爲零,但不會導致運行時異常
var str:String?
println(str!) // Crashes as expected
var str:String! // Implicitly unwrapped
println(str) // Does not crash, not what I expect - it prints nil
我的印象是,隱式解包可選將在使用時導致運行時異常,且爲零。但是下面的代碼沒有運行時異常,爲什麼?隱式解包可選爲零,但不會導致運行時異常
var str:String?
println(str!) // Crashes as expected
var str:String! // Implicitly unwrapped
println(str) // Does not crash, not what I expect - it prints nil
它將變量輸出爲enum(即可選),因爲內部可選是enum Optional<T>
。 更確切地說,我相信它使用debugDescription
財產,其實這是發生了什麼:
var str:String?
println(str) // Prints "nil"
str.debugDescription // Prints "nil"
的隱式展開可選只有強行解開其中預計非可選的情況。 println()
接受所有類型,包括可選項,所以在傳遞到println()
之前不需要強行打開它。由於它沒有被解開,所以不會崩潰。
它打印零,這不是我所期望的 - 我認爲它會崩潰。 – Boon 2014-09-01 20:19:58
查看更新的答案 – Antonio 2014-09-01 20:26:45