2016-07-15 34 views
0

我理解使用optionals足以知道何時必須使用感嘆號打開可選的選項。爲什麼警衛聲明中不需要感嘆號?不使用展開警戒語句

此代碼和編譯但無法使用感嘆號:

struct Blog{ 

    var author:String? 
    var name: String? 

} 

func blogInfo2(blog:Blog?){ 
    guard let blog = blog else { 
    print("Blog is nil") 
    return 
    } 
    guard let author = blog.author, name = blog.name else { 
    print("Author or name is nil") 
    return 
    } 
    print("BLOG:") 
    print(" Author: \(author)") 
    print(" name: \(name)") 
} 

此代碼也可以,如果你真的把驚歎號:

struct Blog{ 

    var author:String? 
    var name: String? 

} 

func blogInfo2(blog:Blog?){ 
    guard let blog = blog! else { 
    print("Blog is nil") 
    return 
    } 
    guard let author = blog.author!, name = blog.name! else { 
    print("Author or name is nil") 
    return 
    } 
    print("BLOG:") 
    print(" Author: \(author)") 
    print(" name: \(name)") 
} 

這是不是有點矛盾或者有人可以清楚地解釋爲什麼不需要感嘆號?

+1

我很驚訝'guard let blog = blog!'版本適合你。你使用的是什麼版本的Swift? –

+0

@PhillipMills是的,現在我意識到在線swift編譯器中嘗試它後,因爲我使用Xcode 8測試版 –

回答

4

guard let unwrapped = optionalOptional Binding(不幸的是,沒有鏈接直接提供給正確的書籍部分)。它安全試圖解開可選的值。如果有值,則解包成功,並將該值分配給給定的名稱。

您應該大力贊成使用可選的綁定,無論使用哪種guardif(所不同的是「展開」名稱的範圍),在使用與!被迫展開。一個失敗的力量解包是一個致命錯誤;你的程序只會崩潰。

1

感嘆號「force」展開可選項。 guard letif let解開它沒有強迫任何東西,所以沒有使用感嘆號。

2

我明白使用optionals足以知道何時必須使用感嘆號打開可選的選項。

我有你理解斯威夫特選配不夠的,如果你作出這樣的斷言的感覺。

一個Optional的背後的合同是它可能會也可能不會是零;你不知道它,因此你必須解開它(像打開一個盒子,看看裏面有什麼),然後才能說出來。

該框可能是空的(nil可選)或者它可能包含一個值。

還有很少的原因使用強迫解包(!)。 非常少,並且在大多數(但不是全部)情況下通常被認爲是不好的做法。

繼續比喻,通過強制解包東西,你說這個盒子裏有東西,我希望你相信我,不要檢查

知道了一個空框將崩潰您的應用程序,這是一件非常危險的事情,考慮選配是在雨燕推出保護你從這些類型的崩潰開始用的。

if let/guard let陳述基本上在箱子內窺視,如果有東西,他們會給你,但他們也給你機會做一些其他的東西,如果箱子是空的。

的Xcode確實力使用IBOutlets時,因爲設計合同是這些對象將可通過您可以在您的視圖控制器使用它們的時間,但展開除非你是100%肯定有值不會是nil,那麼使用guard語句(或if)幾乎總是更好(以及將來證明)。

根據我的經驗,即使您知道,但拋棄guard並忘記未來可能出現的問題仍然更安全。

+3

我會說'!'的用法限於兩種情況。 a /當你無法真正從錯誤中恢復時(例如,由於內存分配失敗而返回'nil')b /當'nil'應被視爲編程錯誤時。例如,從* literal *字符串創建URL時。在那種情況下'''作爲一個斷言。 – Sulthan

+0

@Sulthan同意,在很少的情況下,'!'是可以的,通常是依賴於項目的,但通常更傾向於優雅地處理錯誤(失敗的內存分配)並提供替代方案或告知用戶發生的情況比簡單的崩潰;崩潰是最糟糕的結果,不惜一切代價避免它。語言/框架爲您提供了工具。 –