【问题标题】:Checking if `if let` is nil检查 `if let` 是否为 nil
【发布时间】:2016-02-20 02:29:43
【问题描述】:

我有一个应用程序,我目前正在使用SwiftKeychainWrapper。下面是我检查retrievedString 是否为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
}

【问题讨论】:

    标签: ios swift optional unwrap


    【解决方案1】:

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

    通过尝试将String? 设置为另一个String?,即使值是nil,if let 检查也总是成功,因为两种类型相同,并且都可以接受 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
    }
    

    【讨论】:

    • 请注意,您根本不需要 ':String'。由于上下文,编译器会推断出您希望 retrievedString 为 String。
    • 很好解释。谢谢!
    【解决方案2】:

    您将retrievedString 的类型设置为可选。检查的重点是删除可选项,只使用String

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

    【讨论】:

      猜你喜欢
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      相关资源
      最近更新 更多