我似乎无法在其他问题上找到解决方案。
我正在使用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
如何从字典中获取用户名和密码(Keychain Item)并将它们分配给变量,以便我可以将它们传递给新视图?
答案 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"]
运算符。您应该只在确定时才使用该结果永远不会 !
。而且由于您正在处理钥匙串,因此无法保证。
相反,您应该使用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
}
}
,因为它更清楚地向读者表达了最佳/理想代码路径。
答案 1 :(得分:0)
您的词典是可选的。 要获取用户名,您可以执行类似
的操作let username = dictionary!["username"]
或
let userNameString = dictionary!["username"] as! String