Khởi tạo mảng từ điển trống trong Swift


82

Tôi đang cố gắng khởi tạo các mảng trống trong Swift.

Đối với một mảng chuỗi, nó khá thẳng về phía trước:

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

-> ["a", "b"]

và cho số nguyên

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

-> [1, 2]

nó cũng hoạt động cho các loại đối tượng khác như đối tượng 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 ...>]

Tuy nhiên, tôi không thể tìm ra cú pháp để khởi tạo một mảng Từ điển trống.

Tôi biết bạn có thể có một mảng Từ điển vì việc khởi tạo với giá trị ban đầu hoạt động:

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

var myDictArray = [myDict1]
myDictArray += myDict2

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

Tuy nhiên, điều này (mà bạn mong đợi là cú pháp) không thành công:

var myNewDictArray: Dictionary[] = []

với lỗi Cannot convert the expression's type 'Dictionary[]' to type 'Hashable'

Vì vậy, câu hỏi đặt ra là cách chính xác để khởi tạo một mảng rỗng các Mục từ điển là gì và tại sao cú pháp này không var myNewDictArray: Dictionary[] = []hoạt động?

Câu trả lời:


219

Bạn cần cung cấp các loại cho từ điển:

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

hoặc là

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

Chỉnh sửa : Bạn cũng có thể sử dụng cú pháp ngắn hơn:

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

hoặc là

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

9

Điều này sẽ tạo ra một từ điển trống, bất biến:

let dictionary = [ : ]

Và nếu bạn muốn một cái có thể thay đổi:

var dictionary = [ : ]

Cả hai từ điển này đều mặc định là Dictionary<String?, AnyObject?>.


Ví dụ của bạn không phải về tính bất biến của từ điển, mà là tính bất biến của các biến.
Samy Dindane

6

Lý do điều này không hoạt động:

var myNewDictArray: Dictionary[] = []

là bạn cần cung cấp các loại cho các khóa và giá trị của từ điển khi bạn xác định nó. Mỗi dòng này sẽ tạo cho bạn một mảng từ điển trống với các khóa chuỗi và giá trị chuỗi:

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

1
Vâng, điều này hoạt động. Bất kỳ ý tưởng tại sao có hai cách để làm điều đó?
dwkns

Swift sử dụng kiểu suy luận tại thời điểm biên dịch, vì vậy khi khai báo một biến, bạn có thể chỉ định kiểu (giống như dictArray2không) hoặc ngay lập tức gán cho nó một cái gì đó mà trình biên dịch có thể tìm ra (như dictArray3không). Dòng đầu tiên dài dòng hơn mức cần thiết, nhưng trình biên dịch không bận tâm đến điều đó.
Nate Cook

tôi đã phải thay đổi trên Swift 2 var productImageArray: [Dictionary <String, String>] = []
swiftBoy

0

Bạn không thể sử dụng nối phần tử nữa.

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


-1

Bạn có thể sử dụng nó nếu bạn muốn sử dụng 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)

1
Vui lòng thêm giải thích, những gì bạn viết mã thực sự làm được. Và tại sao nó sẽ khắc phục sự cố của op.
jmattheis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.