【问题标题】:What is the difference between [[String:String]]! and [[String:String]]() in Swift[[String:String]] 和有什么区别!和 [[String:String]]() 在 Swift
【发布时间】:2020-10-14 09:51:52
【问题描述】:

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

var items: [[String: String]]!

我在谷歌搜索了如何定义一个空数组,结果为

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

在使用 items 数组时附加数据时出错

 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:文件”。我给出了核心价值,但它仍然在崩溃。不知道为什么会崩溃。有人可以帮我吗?

【问题讨论】:

  • 你试过了吗:var items = [[String: String]]()
  • 实际上没有 var items = [[String: String]]!这个变量是以前的开发者写的,对以前的代码有效,所以不想改,可能会报错,所以没改
  • !表示它是可选的(与 ? 相同),但可以预期该变量始终会被初始化
  • 如果您不想更改items 的声明,那么您需要搜索代码以便找到初始化它的位置,因为在此之前您无法使用该属性。不过,我个人建议更改声明。

标签: ios arrays swift swift3


【解决方案1】:

因为

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

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

【讨论】:

    【解决方案2】:

    [[String: String]]()[[String: String]] 类型的 Array 对象。

    其中[[String: String]]![[String: String]] 类型的arrayType,它在执行时不能为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]]()
    

    【讨论】:

    • 谢谢Rupesh,我不懂初始化和区别类型
    • 第二件事也是 [String:String] 的数组(字典数组),但正如您解释的那样,它被隐式展开。
    • @user3120670。我更新了答案。你不能使用一个对象,除非你初始化它,因为它没有分配的内存。当您将一个对象声明为[[String: String]]! 时,您是在声明它而不是初始化它,因为该对象没有内存,因此应用程序正在崩溃。
    【解决方案3】:

    第一个对象items 被声明为隐式展开的可选项。如果您将它用作items 而没有可选地展开?,那么您是说您确定items 中有一个值,如果它没有value 我希望应用崩溃。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      相关资源
      最近更新 更多