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 letguard 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:致命错误:在展开可选值时意外发现 nil

swift 2 致命错误:在展开可选值时意外发现 nil - 类别名称

Swift 和 UILabel - 致命错误:在展开可选值时意外发现 nil

(Swift) PrepareForSegue: 致命错误: 在展开可选值时意外发现 nil

swift:致命错误:在展开可选值(lldb)时意外发现 nil,线程 1