티스토리 뷰

Swift Language Guide

2. Collection Types

지우개. 2020. 10. 27. 22:40

전편에 이어서 작성. 학창시절땐 영문 읽는게 그렇게 싫었는데 왜 이렇게 재밌지 이건


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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함