Swift Locksmith:致命错误:在展开Optional值时意外发现nil

时间:2016-02-22 21:42:23

标签: ios swift

我似乎无法在其他问题上找到解决方案。

我正在使用Swift Locksmith(https://github.com/matthewpalmer/Locksmith)库。

这就是我所拥有的:

let dictionary = Locksmith.loadDataForUserAccount("AppData")

当我打印字典时,我得到:

Optional(["username": test, "password": test123])

但是,当我尝试将这些值分配给变量来传递时,我似乎发生了一次不幸事故并得到了错误:

  

致命错误:在解包可选值时意外发现nil

我试着像这样分配它:

username = dictionary["username"]

哪位告诉我:

  

输入'[String:AnyObject]?'没有下标成员

我试着像这样使用.stringValue:

dictionary["username"].stringValue
然后Xcode告诉我'修复它',所以我点击了修复它按钮然后xcode给了我这个:

username = dictionary!["username"]!.stringValue

tl;博士,我的问题

如何从字典中获取用户名和密码(Keychain Item)并将它们分配给变量,以便我可以将它们传递给新视图?

2 个答案:

答案 0 :(得分:1)

涉及两个选项:字典本身(由def string_combinations(str) a = str.chars (1..str.size).flat_map { |n| a.combination(n).map(&:join) }.sort end string_combinations "wxyz" # => ["w", "wx", "wxy", "wxyz", "wxz", "wy", "wyz", "wz", # "x", "xy", "xyz", "xz", "y", "yz", "z"] 返回),以及每个下标的结果(如loadDataForUserAccount["username"])。当您处理许多可选项时,我建议完全避免使用["password"]运算符。您应该只在确定时才使用该结果永远不会 !。而且由于您正在处理钥匙串,因此无法保证。

相反,您应该使用nilif 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 } } ,因为它更清楚地向读者表达了最佳/理想代码路径。

答案 1 :(得分:0)

您的词典是可选的。 要获取用户名,您可以执行类似

的操作
let username = dictionary!["username"]

let userNameString =  dictionary!["username"] as! String