6

我有一个应用程序,我目前正在使用SwiftKeychainWrapper。下面是我检查 if retrievedStringis的代码nil。但是我仍然进入retrievedString: nil控制台。

if-let 语句中的代码不应该运行,还是我不正确地使用/理解 if-let?

对于给定的示例,使用 if-let 解开我的可选值的正确方法是什么?

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

2 回答 2

10

这是因为您将一个可选字符串的值设置String? KeychainWrapper.stringForKey("username")为另一个可选字符串retrievedString

通过尝试将 a 设置String?为 another String?, if let 检查总是成功,即使值是nil,因为两种类型相同,并且都可以接受 nil 值。

相反,您应该尝试将可选字符串设置String?为非可选字符串String. 当 Swift 尝试将非可选设置String为 时nil,它会失败,因为非可选不能有 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
}
于 2016-02-20T02:33:05.090 回答
4

您将类型设置retrievedString为可选。检查的重点是删除可选的并且只拥有一个String.

if let retrievedString: String = KeychainWrapper.stringForKey("username") {
    print("retrievedString: \(retrievedString)")
    //value not nil
} else {
    //Value is nil
}
于 2016-02-20T02:33:17.627 回答