[[String:String]] 有什么区别! Swift 中的 [[String:String]]()

What is the difference between [[String:String]]! and [[String:String]]() in Swift

我正在做一个项目,我发现了一个数组变量

var items: [[String: String]]!

我在google中搜索了如何定义一个空数组,得到的结果是

var itemsNew: [[String: String]]()

使用项目数组时在追加数据时出错

 self.appDelegate.items.append([Name: "sdsd",
                                 rate: "0.2",
                                 Quantity:"3",
                                 Taxable:"true",
                                  Category: "",
                                 inven: "true",
                                  amount : "0.23",
                                 mod: "",
                                 darray: "",
                                 list: "",
                                 famount: "0.0"])

给出错误“致命错误:在隐式解包可选值时意外发现 nil:文件”。我给出了核心价值,但它仍然在崩溃。不知道为什么会崩溃。有人可以帮我吗?

第一个对象 items 被声明为隐式展开的可选对象。如果你将它用作 items 而没有 ? 可选展开,你是说你确定 items 中有一个值我确定它不是 nil 如果它没有值,我希望应用程序崩溃。

在第二种情况下,您正在创建一个 non-optional 字典 itemsNew 的空数组,它不能是 nil 但在声明时是空的。总之,您可以将可选声明替换为空声明,它们仍然会在这些属性中存储相同的类型。

var items = [[String: String]]()
var itemsNew = [[String: String]]()

[[String: String]]()[[String: String]].

类型数组的对象

其中 [[String: String]]! 是类型 [[String: String]] 的数组类型,在执行时不能为 nil,因为它是一个隐式展开的可选。

你得到 Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: file 因为 items 从未被初始化。但是您正在尝试向 items 添加一个项目,这实际上是一个空值。您可以通过将 items 声明替换为以下代码来解决此错误。

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

而且itemsNew的声明也是错误的。您可以如下声明。

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

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

因为

var items: [[String: String]]! not allocating memory or giving back, the reference to item where developer can append the items. 

所以 var itemsNew: [[String: String]]() 正在工作,因为它正在创建内存,您可以在其中追加项目。