NSString 到 String 抛出“致命错误:在展开可选值时意外发现 nil”

Posted

技术标签:

【中文标题】NSString 到 String 抛出“致命错误:在展开可选值时意外发现 nil”【英文标题】:NSString to String throwing "fatal error: unexpectedly found nil while unwrapping an Optional value" 【发布时间】:2015-06-25 20:39:22 【问题描述】:

以下 Swift 代码在 return 语句上崩溃并出现以下错误:

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

根据调试器,结果变量具有非空值。我真的希望该函数接受字符串并返回一个字符串,而不是 NSData。希望这是一个愚蠢的问题,我只是没有看到它。被困在这几个小时了!

println(hmac_sha256("sample_data", inKey: "sample_key"))

    func hmac_sha256(inData: String, inKey: String) -> (String) 

         let data: NSData = inData.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
         let key: NSData = inKey.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!

         var result = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH))

         CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), key.bytes, size_t(key.length), data.bytes, size_t(data.length), result!.mutableBytes)

         return NSString(data: result!, encoding: NSUTF8StringEncoding) as! String
     

【问题讨论】:

您正在显式解包(使用!)所有应该检查的 let/vars 是否为 nil,因此会出现解包错误。如果值为 nil,则返回一个空字符串或继续下一步。 【参考方案1】:

您不能指望能够将任意数据转换为具有 UTF-8 编码的 NSString。例如,UTF-8 永远不能包含字节 0xff,因此包含该字节值的数据永远不能转换为 NSString。

所以无论你多么想得到一个 NSString,你都不会得到它。

【讨论】:

【参考方案2】:

知道了。我想我错过了大局。目标是将 NSData 转换为十六进制字符串。我在 github 上找到了一个很好的方法:https://github.com/CryptoCoinSwift/SHA256-Swift/blob/master/SHA256.swift

【讨论】:

以上是关于NSString 到 String 抛出“致命错误:在展开可选值时意外发现 nil”的主要内容,如果未能解决你的问题,请参考以下文章

PHPUnit 显示抛出致命错误异常的传递方法

instrumentation.retransformClasses() 抛出致命错误

PHP 异常处理 总出现致命错误 无法捕获异常

Swift UITableViewCell detailTextLabel.text 抛出错误“致命错误:无法打开 Optional.None”

致命错误:第 19 行的 C:\xampp\htdocs\register.php 中抛出未捕获的异常“PDOException”

PHP 在尝试包含/需要包含/需要另一个脚本的脚本时抛出致命错误