检查“if let”是否为nil

6
我有一个应用程序,目前正在使用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
}
2个回答

10

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

当尝试将一个String?设置为另一个String?时,即使该值为nil,if let检查始终成功,因为两种类型都相同,且都可以接受空值。

相反,应尝试将可选字符串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
}

请注意,您根本不需要使用“:String”。由于上下文的关系,编译器会自动推断您想要retrieveString成为一个字符串。 - Daniel T.
讲解得很清楚。谢谢! - C. Wagner

4
你将 retrievedString 的类型设置为可选的。检查的整个目的是去掉可选项,只有一个String
if let retrievedString: String = KeychainWrapper.stringForKey("username") {
    print("retrievedString: \(retrievedString)")
    //value not nil
} else {
    //Value is nil
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接