2016-02-20 54 views
4

我有一個應用程序,我目前正在使用SwiftKeychainWrapper。以下是我有的代碼,它檢查​​是否爲nil。不過,我仍然在控制檯中獲得retrievedString: nil檢查'if let`是否

if-let語句中的代碼不應該運行,還是我正在使用/理解if-不正確?

用給出的例子,使用if-let打開我的可選值的正確方法是什麼?

if let retrievedString: String? = KeychainWrapper.stringForKey("username") { 
    print("retrievedString: \(retrievedString)") 
    //value not nil 
} else { 
    //Value is nil 
} 

回答

8

這是因爲你是一個可選的字符串值,String?KeychainWrapper.stringForKey("username")設置到另一個可選的字符串​​。

試圖通過一個String?設置爲另一個String?,中頻讓檢查總是成功,即使當值nil,因爲這兩種類型是一樣的,都可以接受零值。

而應該嘗試將可選字符串String?設置爲非可選字符串String。當Swift嘗試將非可選String設置爲nil時,它將失敗,因爲非可選項不能具有零值。然後,該代碼將繼續在else聲明

您應該使用

//notice the removal of the question mark 
//       | 
//       v 
if let retrievedString: String = KeychainWrapper.stringForKey("username") { 
    print("retrievedString: \(retrievedString)") 
    //value not nil 
} else { 
    //value is nil 
} 
+0

打我也是吧。 –

+0

請注意,您根本不需要':String'。編譯器會因爲上下文而推斷您想要retrieveString爲一個String。 –

+0

很好解釋。謝謝! –

3

您設置的​​類型是可選的。檢查的全部要點是刪除可選項,並且只有一個String

if let retrievedString: String = KeychainWrapper.stringForKey("username") { 
    print("retrievedString: \(retrievedString)") 
    //value not nil 
} else { 
    //Value is nil 
} 
相關問題