Swift Locksmith:致命错误:在展开可选值时意外发现 nil
Posted
技术标签:
【中文标题】Swift Locksmith:致命错误:在展开可选值时意外发现 nil【英文标题】:Swift Locksmith: fatal error: unexpectedly found nil while unwrapping an Optional value 【发布时间】:2016-02-22 21:42:23 【问题描述】:我似乎无法在其他问题上找到解决方案。
我正在使用 Swift Locksmith (https://github.com/matthewpalmer/Locksmith) 库。
这是我所拥有的:
let dictionary = Locksmith.loadDataForUserAccount("AppData")
当我打印出字典时,我得到:
Optional(["username": test, "password": test123])
但是,当我尝试将这些值分配给变量以传递 long 时,我似乎遇到了意外并得到了错误:
致命错误:在展开可选值时意外发现 nil
我试着这样分配它:
username = dictionary["username"]
告诉我的:
键入“[字符串:AnyObject]?”没有下标成员
我尝试像这样使用 .stringValue:
dictionary["username"].stringValue
Xcode 然后告诉我“修复它”,所以我点击了修复它按钮,然后 xcode 给了我这个:
username = dictionary!["username"]!.stringValue
tl;博士所以,我的问题
如何从字典(钥匙串项)中获取用户名和密码并将它们分配给变量,以便我可以将它们传递给新视图?
【问题讨论】:
【参考方案1】:涉及到两个选项:字典本身(由loadDataForUserAccount
返回),以及每个下标的结果(如["username"]
或["password"]
)。当您处理许多选项时,我建议完全避免使用 !
运算符。只有当您确定结果将永远为nil
时,您才应该使用它。而且由于您正在处理钥匙串,因此无法保证。
相反,您应该使用if let
或guard let
来解开您需要的每个对象,并且只有在您获得所需的结果后才能继续。这是一个使用guard let
的示例,我认为这可能是您想要的:
func authenticate()
guard let dictionary = Locksmith.loadDataForUserAccount("AppData"),
let username = dictionary["username"],
let password = dictionary["password"] else
// nothing stored in keychain, the user is not authenticated
return
print("username is \(username).")
print("passsword is \(password).")
你也可以使用if let
重写这个:
func authenticate()
if let dictionary = Locksmith.loadDataForUserAccount("AppData"),
let username = dictionary["username"],
let password = dictionary["password"]
print("username is \(username).")
print("password is \(password).")
else
// nothing stored in keychain, the user is not authenticated
在这种情况下,我更喜欢guard let
,因为它更清楚地向代码的读者表达了最佳/理想的代码路径是什么。
【讨论】:
【参考方案2】:您的字典是可选的。 要获取用户名,您可以执行类似
的操作let username = dictionary!["username"]
或
let userNameString = dictionary!["username"] as! String
【讨论】:
同样的错误:致命错误:在展开可选值时意外发现 nil以上是关于Swift Locksmith:致命错误:在展开可选值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章
SWIFT 致命错误:在展开可选值 (lldb) 时意外发现 nil
swift 2 致命错误:在展开可选值时意外发现 nil - 类别名称
Swift 和 UILabel - 致命错误:在展开可选值时意外发现 nil