2014-06-09 39 views
58

Tôi đang cố gắng bọc đầu xung quanh việc khởi tạo các mảng trống trong Swift.Khởi tạo các dãy từ điển trống trong Swift

Đối với một mảng của 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 làm việc cho các loại đối tượng 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ể làm việc ra cú pháp để khởi tạo một dãy từ điển trống.

Tôi biết bạn có thể có một loạt các từ điển vì initialising 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"]] 

EDIT: Có lỗi trong đoạn mã sau (trộn myNewDictArray và myDictArray) và khi hiệu chỉnh nó doesn' Làm việc như tôi đã nói.

như thực hiện điều này:

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

var myNewDictArray: AnyObject = [] 
myDictArray += myDict1 
myDictArray += myDict2 

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

Tuy nhiên điều này (mà bạn mong đợi cú pháp được) thất bại:

var myNewDictArray: Dictionary[] = [] 

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

Vì vậy, câu hỏi là cách chính xác để khởi tạo một mảng rỗng của các mục từ điển là gì và tại sao cú pháp này không hoạt động?

Trả lời

158

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

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

hoặc

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

Sửa: Bạn cũng có thể sử dụng cú pháp ngắn:

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

hoặc

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

Lý do này không được làm việc:

var myNewDictArray: Dictionary[] = [] 

là bạn cần phải cung cấp các loại cho các phím và các giá trị của một cuốn từ điển khi bạn định nghĩa nó.Mỗi dòng sẽ tạo cho bạn một mảng trống của bộ từ điển với các phím 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

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

+0

Swift sử dụng * kiểu suy luận * tại thời gian biên dịch, vì vậy khi khai báo một biến, bạn có thể chỉ định kiểu (như 'dictArray2' làm) hoặc gán ngay cho nó thứ gì đó mà trình biên dịch có thể tìm ra (như' dictArray3'). Dòng đầu tiên có nhiều chi tiết 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 đó. –

+0

tôi đã phải thay đổi trên Swift 2 ** var productImageArray: [Dictionary ] = [] ** – swiftBoy

9

này sẽ tạo ra một sản phẩm nào, từ điển bất biến:

let dictionary = [ : ]

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

var dictionary = [ : ]

Cả hai bộ từ điển mặc định để Dictionary<String?, AnyObject?>.

+0

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

0

Bạn không còn có 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 
0
var yourArrayname = [String]() // String or anyOther according to need 
-1

Bạn có thể sử dụng điều này nếu u muốn sử dụng nhanh chóng 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, mã bạn thực sự làm. Và tại sao nó nên khắc phục vấn đề của op. – jmattheis

Các vấn đề liên quan