Swift에서 빈 사전 배열 초기화


82

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[] = []작동 하지 않는 이유는 무엇입니까?

답변:


219

사전에 유형을 제공해야합니다.

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

또는

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

편집 : 더 짧은 구문을 사용할 수도 있습니다.

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

또는

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

9

이렇게하면 변경 불가능한 비어있는 사전이 생성됩니다.

let dictionary = [ : ]

그리고 변경 가능한 것을 원한다면 :

var dictionary = [ : ]

이 두 사전의 기본값은 모두입니다 Dictionary<String?, AnyObject?>.


귀하의 예는 사전의 불변성에 관한 것이 아니라 변수의 불변성에 관한 것입니다.
Samy Dindane

6

이것이 작동하지 않는 이유 :

var myNewDictArray: Dictionary[] = []

사전을 정의 할 때 사전의 키와 값에 대한 유형을 제공해야한다는 것입니다. 이러한 각 줄은 문자열 키와 문자열 값이있는 빈 사전 배열을 만듭니다.

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

1
예, 작동합니다. 왜 두 가지 방법이 있는지 아십니까?
dwkns

Swift는 컴파일 타임에 유형 추론 을 사용하므로 변수를 선언 할 때 유형을 지정 dictArray2하거나 (하는 것과 같이 ) 컴파일러가 알아낼 수있는 것을 즉시 할당 할 수 있습니다 (하는 것과 같이 dictArray3). 첫 번째 줄은 필요 이상으로 장황하지만 컴파일러는 그것을 신경 쓰지 않습니다.
Nate Cook

난 스위프트 (2)에 변경 한 VAR productImageArray : 사전 <문자열, 문자열> = []
swiftBoy

0

더 이상 요소 연결을 사용할 수 없습니다.

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

신속한 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
실제로 코딩하는 작업에 대한 설명을 추가하십시오. 그리고 왜 op의 문제를 해결해야하는지.
jmattheis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.