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

Posted

技术标签:

【中文标题】NSDictionary:错误在展开可选值时意外发现 nil【英文标题】:NSDictionary: error Unexpectedly found nil while unwrapping an Optional value 【发布时间】:2015-12-02 03:25:55 【问题描述】:

我在操场上玩一个想法。这个想法 NSDictionaries 用作“保留”数据的一种方式。

我开始创建一个名为layervariable 类型[String:[String:String]]

所以,发生了错误。我一个小时试图解决,找不到错误原因发生。我是 Swift 新手。

var layers: [String:[String:String]]!

layers["key"] = ["layer":"layer"]
layers["key2"] = ["asd":"12312"]

print(layers)

有人可以帮我吗?或者告诉我如何获得我的 NSDictionaries 的最终结果?

【问题讨论】:

顺便说一下,这是一个 Swift Dictionary,但它不是 NSDictionary,如果您使用 import Foundationimport UIKitimport Cocoa,它是可用的类型。您应该尽可能使用 Swift 字典,因为 NSDictionary 本质上是 [NSObject: AnyObject] 类型,因此在从中检索值时必须进行更多类型转换。 【参考方案1】:

您已声明变量 layers 的类型,但尚未为其分配存储空间。

试试这个:

var layers = [String:[String:String]]()

如果你坚持 layers 是一个隐式解包的可选,那么你可以这样初始化它:

var layers: [String:[String:String]]! = [:]

这将允许您稍后将nil 分配给它,但这会很危险,因为如果您尝试在它为nil 时使用它会崩溃。这就是你崩溃的原因。

如果您希望它是可选的,您应该使用? 声明它,以便可以安全地解包:

var layers: [String:[String:String]]?

// Sometime later
layers = [:]

// use optional chaining to assign values, this safely does
// nothing if layers is nil    
layers?["key"] = ["layer":"layer"]
layers?["key2"] = ["asd":"12312"]

// use optional binding to unwrap layers    
if let unwrapped_layers = layers 
    print(unwrapped_layers)

在 Playground 中尝试此操作,然后尝试注释掉 layers = [:] 部分,您会发现它不会崩溃,因为对 layers 的所有访问都是以安全方式完成的,可以正确处理 @987654331 时的情况@ 是 nil

【讨论】:

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

prepareForSegue 出错“”在展开可选值时意外发现 nil“”

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

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

为啥我收到错误:致命错误:在展开可选值时意外发现 nil?

Alamofire 平面错误:在展开可选值时意外发现 nil

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