【问题标题】:Initialising empty arrays of dictionaries in Swift在 Swift 中初始化空的字典数组
【发布时间】:2014-07-29 13:00:06
【问题描述】:

我正试图在 Swift 中初始化空数组。

对于字符串数组,它非常简单:

var myStringArray: String[] = []
myStringArray += "a"
myStringArray += "b"

-> ["a", "b"]

对于整数

var myIntArray: Int[] = []
myIntArray += 1
myIntArray += 2

-> [1, 2]

它也适用于其他类型的对象,例如 NSImage 对象:

let path = "/Library/Application Support/Apple/iChat Icons/Flags/"
let image1 = NSImage(byReferencingFile: path + "Brazil.png")
let image2 = NSImage(byReferencingFile: path + "Chile.png")

var myImageArray: NSImage[] = []
myImageArray += image1
myImageArray += image2

-> [<NSImage 0x7fe371c199f0 ...>, <NSImage 0x7fe371f39ea0 ...>]

但是我无法确定初始化空字典数组的语法。

我知道您可以拥有一个字典数组,因为使用初始值进行初始化是可行的:

let myDict1 = ["someKey":"someValue"]
let myDict2 = ["anotherKey":"anotherValue"]

var myDictArray = [myDict1]
myDictArray += myDict2

-> [["someKey": "someValue"], ["anotherKey": "anotherValue"]]

然而,这(你期望的语法)失败了:

var myNewDictArray: Dictionary[] = []

出现错误Cannot convert the expression's type 'Dictionary[]' to type 'Hashable'

所以问题是初始化空字典项数组的正确方法是什么?为什么这种语法var myNewDictArray: Dictionary[] = [] 不起作用?

【问题讨论】:

    标签: arrays dictionary swift


    【解决方案1】:

    您需要为字典指定类型:

    var myNewDictArray: [Dictionary<String, Int>] = []
    

    var myNewDictArray = [Dictionary<String, Int>]()
    

    编辑:您也可以使用较短的语法:

    var myNewDictArray: [[String:Int]] = []
    

    var myNewDictArray = [[String:Int]]()
    

    【讨论】:

      【解决方案2】:

      这不起作用的原因:

      var myNewDictArray: Dictionary[] = []
      

      是在定义字典时需要为字典的键和值提供类型。这些行中的每一行都会为您创建一个包含字符串键和字符串值的空字典数组:

      var dictArray1: Dictionary<String, String>[] = Dictionary<String, String>[]()
      var dictArray2: Dictionary<String, String>[] = []
      var dictArray3 = Dictionary<String, String>[]()
      

      【讨论】:

      • 是的,这行得通。知道为什么有两种方法吗?
      • Swift 在编译时使用 类型推断,因此在声明变量时,您可以指定类型(如 dictArray2 所做的那样)或立即为其分配编译器可以弄清楚(就像dictArray3 一样)。第一行比必要的更冗长,但编译器并不介意。
      • 我必须在 Swift 2 上进行更改 var productImageArray: [Dictionary] = [ ]
      【解决方案3】:

      这将创建一个空的、不可变的字典:

      let dictionary = [ : ]

      如果你想要一个可变的:

      var dictionary = [ : ]

      这两个字典都默认为Dictionary&lt;String?, AnyObject?&gt;

      【讨论】:

      • 你的例子不是关于字典的不变性,而是变量的不变性。
      【解决方案4】:

      您不能再使用元素连接。

      class Image {}
      Image i1
      Image i2
      
      var x = [Image]()
      
      x += i1 // will not work (adding an element is ambiguous)
      x += [i1] // this will work (concatenate an array to an array with the same elements)
      
      x += [i1, i2] // also good
      

      【讨论】:

        【解决方案5】:
        var yourArrayname = [String]() // String or anyOther according to need
        

        【讨论】:

          【解决方案6】:

          如果你想使用 swift 2.3,你可以使用它!

          let path = "/Library/Application Support/Apple/iChat Icons/Flags/"
          let image1 = UIImage(contentsOfFile: readPath + "Brazil.png")
          let image2 = UIImage(contentsOfFile: readPath + "Chile.png")
          
          var myImageArray = [UIImage]()
          myImageArray.append(image1)
          myImageArray.append(image2)
          

          【讨论】:

          • 请添加解释,您的代码实际上做了什么。以及为什么它应该解决 op 的问题。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-21
          • 2018-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多