Swift에서는 콜렉션 타입으로 Array, Dictionary, Set 세 가지를 지원한다.
Array, Dictionary, Set을 변수(var
)에 할당하면 이 콜렉션은 변경가능하고 상수(let
)에 할당하면 변경이 불가능하다.
배열 타입은 Array로 적을 수 있는데 축약형으로 [Element]
형태로 사용할 수 있다.
아래와 같이 Int
형 빈 배열을 생성할 수 있다.
var someInts = [Int]()
print("someInts is of type [Int] with \(someInt.count) items.")
// someInts is of type [Int] with 0 items.
someInts.append(3)
// 배열에 3을 추가
someInts = []
// 배열 비우기. 배열의 아이템 타입은 그대로 Int로 유지된다.
repeating
메소드와 count
메소드를 이용해 기본 값으로 빈 배열을 생성할 수 있다.
var threeDoubles = Array( repeating: 0.0, count: 3 )
// threeDoubles : Double 타입의 [ 0.0, 0.0, 0.0 ]
+
연산자를 이용해 배열을 합칠 수 있다.
var anotherThreeDoubles = Array( repeating: 2.5, count: 3 )
// anotherThreeDoubles : [ 2.5, 2.5, 2.5 ]
var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles : [ 0.0, 0.0, 0.0, 2.5, 2.5, 2.5 ]
[ value1, value2, value3 ]
형태를 이용해 배열을 생성할 수 있다.
var shoppingList: [String] = [ "Eggs", "Milk" ]
더 간단하게 선언할 수도 있다.
var shoppingList = [ "Eggs", "Milk" ]
배열의 원소 개수 확인
print("The shopping list contains \(shoppingList.count) items.")
// The shopping list contains 2 items.
배열이 비었는지 확인
if shoppingList.isEmpty {
print("The shopping list is empty.")
} else {
print("The shopping list is not empty.")
}
// The shopping list is not empty.
배열에 원소 추가
shoppingList.append("Four")
// shoppingList.count = 3
shoppingList += [ "Baking Powder" ]
// shoppingList.count = 4
shoppingList += [ "Chocolate Spread", "Cheese", "Butter" ]
// shoppingList.count = 7
배열의 특정 위치의 원소 접근
var firstItem = shoppingList[0]
// firstItem : "Eggs"
배열의 특정 위치의 원소 변경
shoppingList[0] = "Six eggs"
// 배열의 첫번째 원소가 "Eggs"에서 "Six eggs"로 변경
shoppingList[4..6] = [ "Bananas", "Apples" ]
// 4, 5, 6번째 인덱스 아이템을 Bananas, Apples로 변환
// 즉, 아이템 3개가 2개로 줄었다.
// shoppingList.count = 6
특정 위치에 원소 추가/삭제/접근
shoppingList.insert( "Maple Syrub", at: 0 )
// shoppingList.count = 7
let maplesyrub = shinppingList.remove(at: 0)
// shoppingList.count = 6
firstItem = shoppingList[0]
// firstItem : "Six eggs"
let apples = shoppingList.removeLast()
// shoppingList.count = 5
for-in loop
를 이용해 배열을 순회할 수 있다.
for item in shoppingList {
print(item)
}
// Six eggs
// Milk
// Flour
// Baking Powder
// Bananas
배열의 값과 인덱스가 필요할 때는 enumerated()
메소드를 사용한다.
이때 배열의 인덱스는 0부터 시작한다.
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
Set 형태로 저장되기 위해서 반드시 타입이 hashable
이어야한다.
Swift에서 String
, Int
, Double
, Bool
같은 기본 타입은 기본적으로 hashable
이다.
Set은 순서가 정의되지 않은 콜렉션에서 동일한 유형의 고유한 값을 저장한다. 항목 순서가 중요하지 않거나 항목을 확인해야 하는 경우 Array 대신 Set을 사용할 수 있다.
var letters = Set<Character>()
print("letters is of of type Set<Character> with \(letters.count) item.")
// letters is of of type Set<Character> with 0 item.
letters.insert("a")
// 이제 letters는 Character 타입의 값을 1개 갖는다.
letters = []
// 이제 letters는 빈 Set이다. 하지만 여전히 Character 타입의 Set이다.
var favoritGenres: Set<String> = [ "Rock", "Hip Hop", "Classical", ]
// favoriteGeneres가 세 가지 초기 항목으로 초기화
Swift의 타입추론으로 아래와 같은 선언도 가능하다.
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]
count
프로퍼티를 통해 Set의 원소 개수를 셀 수 있다.
print("I have \(favoriteGenres.count) favorite music genres.")
// I have 3 favorite music genres.
Set은 isEmpty
, insert(\_:)
, remove(\_:)
, contains(\_:)
메소드를 사용할 수 있다.
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은 4 개의 원소를 포함
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-in loop
를 사용해 Set을 순회할 수 있다.
for genre in favoriteGenres {
print("\(genre)")
}
// Classical
// Hip hop
// Jazz
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의 동등비교와 맴버 여부를 확인하기 위해 각각 ==
연산자와 isSuperset(of:)
, isStrictSubset(of:)
, isStrictSuperset(of:)
, isDisjoint(with:)
메소드를 사용한다.
let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]
houseAnimals.isSubset(of: farmAnimals)
// true
// Set의 모든 값이 지정된 Set에 포함되어 있는지 여부를 확인
farmAnimals.isSuperset(of: houseAnimals)
// true
// Set에 지정된 Set의 모든 값이 포함되어 있는지 여부를 확인
farmAnimals.isStrictSubset(of: houseAnimals)
// false
houseAnimals.isStrictSubset(of: farmAnimals)
// true
// Set이 지정된 Set과 같지 않지만 부분 집합인지 상위 집합인지를 확인하려면 isStrictSubset(:) 또는 isStrictSuperset(:) 메서드를 사용합니다.
farmAnimals.isDisjoint(with: cityAnimals)
// true
// 두 개의 Set가 공통점이 없는지 확인
Dictionar는 정의된 순서 없이 콜렉션에 동일한 유형의 key
와 value
사이의 연결을 저장한다.
각 value는 Dictionary 내에서 해당 value
의 식별자 역할을 하는 고유한 key
와 연결된다. Array의 항목과 달리 Dictionary의 항목에는 순서가 지정되어 있지 않다.
실제 Dictionary가 특정 단어의 정의를 찾는 데 사용되는 것과 거의 같은 방식으로 식별자를 기준으로 값을 검색해야 할 때 Dictionary를 사용한다.
주의
Swift의 Dictionary타입은 Foundation 클래스의 NSDictionary를 bridge한 타입이다.
[Key: Value]
형태로 Dictionary를 선언해 사용할 수 있다.
var namesOfIntegers: [Int: String] = [:]
// namesOfIntegers은 비어있는 [Int: String] 타입의 Dictionary
또는 아래와 같이 빈 Dictionary를 생성할 수 있다.
var alsoNamesOfIntegers: [Int: String]()
namesOfIntegers[16] = "sixteen"
// 이제 namesOfIntegers 1 개의 key-value 쌍을 포함
namesOfIntegers = [:]
// 다시 namesOfIntegers는 비어있는 [Int: String] 타입의 Dictionary
[key1: value1, key2: value2, key3: value3]
형태로 Dictionary를 선언할 수 있다.
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
print("The airports dictionary contains \(airports.count) items.")
// The airports dictionary contains 2 items.
빈 Dictionary 확인
if airports.isEmpty {
print("The airports dictionary is empty.")
} else {
print("The airports dictionary isn't empty.")
}
// Prints "The airports dictionary isn't empty."
서브스크립트를 사용하여 Dictionary에 새 항목을 추가할 수 있다.
적절한 유형의 새 key
를 서브스크립트 인덱스로 사용하고 적절한 유형의 새 value
을 할당한다.
airports["LHR"] = "London"
// key는 "LHR", value는 "London"인 새로운 key-value를 할당