Swift의 Array, Set 및 Dictionary 유형은 일반 컬렉션으로 구현됩니다. 제네릭 형식 및 컬렉션에 대한 자세한 내용은 제네릭을 참조하세요.
컬렉션을 변경할 필요가 없는 모든 경우에 변경할 수 없는 컬렉션을 만드는 것이 좋습니다.
그렇게 하면 코드에 대해 더 쉽게 추론할 수 있고 Swift 컴파일러가 생성한 컬렉션의 성능을 최적화할 수 있습니다.
Swift의 Array 유형은 Foundation의 NSArray 클래스에 연결됩니다.
초기화 구문을 사용하여 특정 유형의 빈 Array을 만들 수 있습니다.
var someInts: [Int] = []
print("someInts is of type [Int] with \(someInts.count) items.")
// Prints "someInts is of type [Int] with 0 items."
컨텍스트가 이미 함수 인수 또는 이미 유형이 지정된 변수 또는 상수와 같은 유형 정보를 제공하는 경우, 로 작성된 빈 Array Literal을 사용하여 빈 Array을 만들 수 있습니다
someInts.append(3)
// someInts now contains 1 value of type Int
someInts = []
// someInts is now an empty array, but is still of type [Int]
var threeDoubles = Array(repeating: 0.0, count: 3)
// threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]
더하기 연산자(+)를 사용하여 호환되는 유형의 기존 Array 두 개를 함께 추가하여 새 Array을 만들 수 있습니다. 새 Array의 유형은 함께 추가하는 두 Array의 유형에서 유추됩니다.
var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
// anotherThreeDoubles is of type [Double], and equals [2.5, 2.5, 2.5]
var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles is inferred as [Double], and equals [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
var shoppingList: [String] = ["Eggs", "Milk"]
-> var shoppingList = ["Eggs", "Milk"]
// shoppingList has been initialized with two initial items
메서드 및 속성을 통해 또는 아래 첨자 구문을 사용하여 Array에 액세스하고 수정합니다.
print("The shopping list contains \(shoppingList.count) items.")
// Prints "The shopping list contains 2 items."
if shoppingList.isEmpty {
print("The shopping list is empty.")
} else {
print("The shopping list isn't empty.")
}
// Prints "The shopping list isn't empty."
shoppingList.append("Flour")
// shoppingList now contains 3 items, and someone is making pancakes
shoppingList += ["Baking Powder"]
// shoppingList now contains 4 items
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
// shoppingList now contains 7 items
var firstItem = shoppingList[0]
// firstItem is equal to "Eggs"
shoppingList[0] = "Six eggs"
// the first item in the list is now equal to "Six eggs" rather than "Eggs"
shoppingList[4...6] = ["Bananas", "Apples"]
// shoppingList now contains 6 items
shoppingList.insert("Maple Syrup", at: 0)
// shoppingList now contains 7 items
// "Maple Syrup" is now the first item in the list
let mapleSyrup = shoppingList.remove(at: 0)
// the item that was at index 0 has just been removed
// shoppingList now contains 6 items, and no Maple Syrup
// the mapleSyrup constant is now equal to the removed "Maple Syrup" string
firstItem = shoppingList[0]
// firstItem is now equal to "Six eggs"
let apples = shoppingList.removeLast()
// the last item in the array has just been removed
// shoppingList now contains 5 items, and no apples
// the apples constant is now equal to the removed "Apples" string
for item in shoppingList {
print(item)
}
// Six eggs
// Milk
// Flour
// Baking Powder
// Bananas
for (index, value) in shoppingList.enumerated() {
print("Item \(index + 1): \(value)")
}
// Item 1: Six eggs
// Item 2: Milk
// Item 3: Flour
// Item 4: Baking Powder
// Item 5: Bananas
var letters = Set<Character>()
print("letters is of type Set<Character> with \(letters.count) items.")
// Prints "letters is of type Set<Character> with 0 items."
letters.insert("a")
// letters now contains 1 value of type Character
letters = []
// letters is now an empty set, but is still of type Set<Character>
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
// favoriteGenres has been initialized with three initial items
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]
메서드와 속성을 통해 Set에 액세스하고 수정합니다.
print("I have \(favoriteGenres.count) favorite music genres.")
// Prints "I have 3 favorite music genres."
if favoriteGenres.isEmpty {
print("As far as music goes, I'm not picky.")
} else {
print("I have particular music preferences.")
}
// Prints "I have particular music preferences."
favoriteGenres.insert("Jazz")
// favoriteGenres now contains 4 items
if let removedGenre = favoriteGenres.remove("Rock") {
print("\(removedGenre)? I'm over it.")
} else {
print("I never much cared for that.")
}
// Prints "Rock? I'm over it."
if favoriteGenres.contains("Funk") {
print("I get up on the good foot.")
} else {
print("It's too funky in here.")
}
// Prints "It's too funky in here."
for genre in favoriteGenres {
print("\(genre)")
}
// Classical
// Jazz
// Hip hop
for genre in favoriteGenres.sorted() {
print("\(genre)")
}
// Classical
// Hip hop
// Jazz
아래 그림은 음영 영역으로 표시되는 다양한 Set 작업의 결과와 함께 두 개의 Set(a 및 b)을 보여줍니다.
Intersection(_:) 메서드를 사용하여 두 Set에 공통적인 값만 있는 새 Set을 만듭니다.
symmetricDifference(_:) 메서드를 사용하여 두 Set 중 하나에 값이 있는 새 Set을 만들 수 있습니다.
Union(_:) 메서드를 사용하여 두 Set의 모든 값을 사용하여 새 Set을 만듭니다.
지정된 Set에 없는 값을 사용하여 새 Set을 만들려면 subtracting(_:) 메서드를 사용합니다.
let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
oddDigits.intersection(evenDigits).sorted()
// []
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]
아래 그림은 Set 간에 공유되는 요소를 나타내는 겹치는 영역이 있는 세 개의 Set(a, b, c)을 보여줍니다.
“is equal” 연산자(==)를 사용하여 두 Set에 동일한 값이 모두 포함되어 있는지 확인합니다.
isSubset(of:) 메서드를 사용하여 Set의 모든 값이 지정된 Set에 포함되어 있는지 확인합니다.
isSuperset(of:) 메서드를 사용하여 Set에 지정된 Set의 모든 값이 포함되어 있는지 확인합니다.
isStrictSubset(of:) 또는 isStrictSuperset(of:) 메서드를 사용하여 Set이 하위 Set인지 상위 Set인지 확인하지만 지정된 Set과 같지는 않습니다.
isDisjoint(with:) 메서드를 사용하여 두 Set에 공통 값이 없는지 확인합니다.
let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]
houseAnimals.isSubset(of: farmAnimals)
// true
farmAnimals.isSuperset(of: houseAnimals)
// true
farmAnimals.isDisjoint(with: cityAnimals)
// true
Dictionary 키 유형은 Set의 값 유형과 같이 Hashable 프로토콜을 준수해야 합니다.
var namesOfIntegers: [Int: String] = [:]
// namesOfIntegers is an empty [Int: String] dictionary
namesOfIntegers[16] = "sixteen"
// namesOfIntegers now contains 1 key-value pair
namesOfIntegers = [:]
// namesOfIntegers is once again an empty dictionary of type [Int: String]
[key 1: value 1, key 2: value 2, key 3: value 3]
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
메서드 및 속성을 통해 또는 아래 첨자 구문을 사용하여 Dictionary에 액세스하고 수정합니다.
print("The airports dictionary contains \(airports.count) items.")
// Prints "The airports dictionary contains 2 items."
if airports.isEmpty {
print("The airports dictionary is empty.")
} else {
print("The airports dictionary isn't empty.")
}
// Prints "The airports dictionary isn't empty."
airports["LHR"] = "London"
// the airports dictionary now contains 3 items
airports["LHR"] = "London Heathrow"
// the value for "LHR" has been changed to "London Heathrow"
updateValue(_:forKey:) 메서드는 Dictionary 값 유형의 선택적 값을 반환합니다.
이 메서드는 String? 또는 "선택적 String" 유형의 값을 반환합니다. 이 선택적 값은 업데이트 이전에 존재했다면 해당 키에 대한 이전 값을 포함하고, 값이 존재하지 않으면 nil을 포함합니다.
if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
print("The old value for DUB was \(oldValue).")
}
// Prints "The old value for DUB was Dublin."
아래 구문을 사용하여 특정 키에 대한 Dictionary에서 값을 검색할 수도 있습니다. 값이 존재하지 않는 키를 요청할 수 있기 때문에 Dictionary의 첨자는 Dictionary 값 유형의 선택적 값을 반환합니다.
if let airportName = airports["DUB"] {
print("The name of the airport is \(airportName).")
} else {
print("That airport isn't in the airports dictionary.")
}
// Prints "The name of the airport is Dublin Airport."
아래 구문을 사용하여 해당 키에 nil 값을 할당하여 Dictionary에서 키-값 쌍을 제거할 수 있습니다.
airports["APL"] = "Apple International"
// "Apple International" isn't the real airport for APL, so delete it
airports["APL"] = nil
// APL has now been removed from the dictionary
removeValue(forKey:) 메소드를 사용하여 Dictionary에서 키-값 쌍을 제거할 수 있습니다.
이 메서드는 키-값 쌍이 있으면 제거하고 제거된 값을 반환하거나 값이 없으면 nil을 반환합니다.
if let removedValue = airports.removeValue(forKey: "DUB") {
print("The removed airport's name is \(removedValue).")
} else {
print("The airports dictionary doesn't contain a value for DUB.")
}
// Prints "The removed airport's name is Dublin Airport."
for-in 루프를 사용하여 Dictionary의 키-값 쌍을 반복할 수 있습니다.
Dictionary의 각 항목은 (키, 값) 튜플로 반환되며 반복의 일부로 튜플의 구성원을 임시 상수 또는 변수로 분해할 수 있습니다.
for (airportCode, airportName) in airports {
print("\(airportCode): \(airportName)")
}
// LHR: London Heathrow
// YYZ: Toronto Pearson
key 및 values 속성에 액세스하여 Dictionary의 키 또는 값의 반복 가능한 컬렉션을 검색할 수도 있습니다.
for airportCode in airports.keys {
print("Airport code: \(airportCode)")
}
// Airport code: LHR
// Airport code: YYZ
for airportName in airports.values {
print("Airport name: \(airportName)")
}
// Airport name: London Heathrow
// Airport name: Toronto Pearson
Array 인스턴스를 사용하는 API와 함께 Dictionary의 키 또는 값을 사용해야 하는 경우 keys 또는 values 속성을 사용하여 새 Array을 초기화해야합니다.
let airportCodes = [String](airports.keys)
// airportCodes is ["LHR", "YYZ"]
let airportNames = [String](airports.values)
// airportNames is ["London Heathrow", "Toronto Pearson"]
Swift의 Dictionary 유형에는 정의된 순서가 없습니다. 특정 순서로 Dictionary의 키 또는 값을 반복하려면 해당 키 또는 값 속성에서 sorted() 메서드를 사용합니다.