티스토리 뷰
전편에 이어서 작성. 학창시절땐 영문 읽는게 그렇게 싫었는데 왜 이렇게 재밌지 이건
Swift는 세가지 주요한 Collection type을 제공하는데 알다시피 Array, Set 그리고 Dictionary.
Array는 정렬된 값 집합.
Set은 정렬되지않은 특수한 값 집합.
Dictionary는 정렬되지않은 키-값 으로 되어 있는 집합.
스위프트에선 타입에 깐깐한 언어 답게 값과 키를 저장할 때 명확하게 타입을 선언해야함.
Mutability of Collections
다른 타입들과 마찬가지로 var는 값 바꿀 수 있고 불변성 주려면 let
Arrays
정렬된 리스트에 값은 타입 값들을 저장함. 같은 값이라도 여러번 다른 위치에 저장할 수 있음.
선언하는 방법은 축약방법이 다양해서 여러가지가 있는데,
//빈 배열의 경우.
var someInts = [Int]()
var someStrings: [String] = []
//값 반복해서 지정.
var threeDoubles = Array(repeating: 0.0, count: 3)
//리터럴 값 넣어서 생성.
var shoppingList: [String] = ["Eggs", "Milk"]
주로 쓰는 건 이정도.
전에 String 타입에 배웠던 것 처럼 +, += 연산자 사용가능하며 .count, .isEmpty도 사용가능하다.
다른 언어랑 다르게 조금 귀찮아진 String 요소 접근에 비해 이쪽은 ... / ..< 이거 두 개 추가로 인해 좀 더 편리하게 배열값 접근이 가능해졌다.
var firstItem = shoppingList[0]
//이건 당연히 되고
shoppingList[4...6] = ["Bananas", "Apples"]
//이렇게도 된다! 참고로 4부터 6이니까 값 3개인데 2개 넣어주면 마지막꺼 사라지고
//이 배열의 길이는 6이 된다.
그리고 배열 가지고 노는 법은
shoppingList.insert("Maple Syrup", at: 0)
let mapleSyrup = shoppingList.remove(at: 0)
let apples = shoppingList.removeLast()
//map, filter, reduce 삼대장 외 기타 등등...
그리고 String 타입과 마찬가지로 for - in 루프로 값 접근 가능하다.
그리고 추가로 인덱스 접근은 배열.enumerated() 메소드를 쓰면 튜플로 (index, value) 로 반환해준다.
Sets
Set은 구별되는 값들을 순서를 정의하지 않고 저장한 집합이다. 항목이 한 번 씩 나오고 순서가 별로 안중요하다면 배열대신 셋을 쓸 수 있다.
set에 저장되는 값들은 전부 hashable 프로토콜을 준수해야 한다. (hasable 프로토콜을 모른다면 대강 동등함을 서로 비교할 수 있는 상태가 되게 만드는 규칙? 정도로 생각하면 된다) Swift의 기본적인 타입들은 전부 Hashable을 기본적으로 준수하기 때문에 Set의 값이나 Dictionary의 키값으로 사용할 수 있다.
얘는 축약형이 거의 없다시피 하다.
var letters = Set<Character>()
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
letters.insert("a")
또.
전에 String 타입에 배웠던 것 처럼 +, += 연산자 사용가능하며 .count, .isEmpty도 사용가능하다.
favoriteGenres.remove("Rock")
// <= 신기하게 삭제되면 삭제된 값을 반환하고 삭제하려는 값이 없다면 nil을 반환한다.
favoriteGenres.insert("Jazz")
//인덱스 값이 없는 것에 주목
favoriteGenres.contains("Funk")
또다시.
For-in 루프 사용가능하다. 글고 애네는 정렬이 안되어있기 때문에 sorted() 메소드 값을 써서 오름차순으로 정렬가능하다.
Performing Set Operations
set이 가지고 있는 특성. 집합 생각하면 된다.
아래는 집합 끼리의 관계를 Bool 값으로 반환하는 메소드들.
let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]
houseAnimals.isSubset(of: farmAnimals)
// true
farmAnimals.isSuperset(of: houseAnimals)
// true
farmAnimals.isDisjoint(with: cityAnimals)
// true
Dictionaries
Dictionary는 정렬되지 않은 (같은 타입의 키 - 같은 타입의 값) 세트로 저장하는 집합이다.
이친구는 그나마 축약형이 있다.
var namesOfIntegers = [Int: String]()
namesOfIntegers = [:]
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
앞에 반복했던 것 처럼.
.count랑 .isEmpty 사용가능.
앞선 친구들과 구별되게 updateValue(_:forKey:) 메소드가 있는데 key값을 찾아서 새로운 값으로 업데이트 해주는 메소드.
업데이트를 한 후 옛날 값을 옵셔널로 반환해준다. 그리고 removeValue(forKey:)의 경우 key값을 찾아 업애주며 만약 값이 없으면 nil을 리턴한다.
if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
print("The old value for DUB was \(oldValue).")
}
if let removedValue = airports.removeValue(forKey: "DUB") {
print("The removed airport's name is \(removedValue).")
} else {
print("The airports dictionary does not contain a value for DUB.")
}
그리고 개별 값에는 키값을 넣어줘서 접근 가능하다.
airports["APL"] = "Apple International"
for - in 문 쓰면 키와 값이 튜플로 반환된다.
for airportCode in airports.keys {
print("Airport code: \(airportCode)")
}
만약에 Dictionary를 Array로 변환하고자 한다면, key와 value 별도로 분리해서 내보낸다..
let airportCodes = [String](airports.keys)
// airportCodes is ["LHR", "YYZ"]
let airportNames = [String](airports.values)
// airportNames is ["London Heathrow", "Toronto Pearson"]
'Swift Language Guide' 카테고리의 다른 글
6. Enumerations (0) | 2020.11.01 |
---|---|
5. Closures (0) | 2020.10.31 |
4. Functions (0) | 2020.10.29 |
3. Control Flow (0) | 2020.10.28 |
1. String and Characters (0) | 2020.10.27 |