2016-02-20 57 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 
} 
相关问题