5.1 배열

var names: [String] = ["dino", "yagom", "dino"]
var emptyArray: [Any] = []
print(names.count)
print(emptyArray.isEmpty)

print(names[2]) // 2번째 인덱스 아이템 get
names[2] = "jenny" // 2번째 인덱스에 아이템 set
print(names[2]) // 2번째 인덱스 아이템이 jenny로 변경됨
//print(names[4]) // 인덱스 범위를 벗어나서 오류 발생

names.append("elsa") // append를 사용해 item 추가
names.append(contentsOf: ["john", "max"]) // contentsOf로 여러개를 같이 추가 할 수 있음
names.insert("happy", at: 2) // 2번째 인덱스에 아이템 추가
names.insert(contentsOf: ["jinhee", "minsoo"], at: 5) // 5번째 인덱스에 여러 아이템 추가

print(names[4]) // 4번째 아이템 get
print(names.firstIndex(of: "dino") ?? -1) // 앞에서 부터 index 찾기
print(names.lastIndex(of: "aaa") ?? -1) // 뒤에서 부터 index 찾기
print(names.first ?? "default") // 첫번째 인덱스 값 get
print(names.last ?? "default") // 마지막 인덱스 값 get

let firstItem: String = names.removeFirst() // 첫번째 인덱스 제거하면서 return
let lastItem: String = names.removeLast() // 마지막 인덱스 제거하면서 return
let indexZeroItem: String = names.remove(at: 0) // 특정 인덱스 제거하면서 return

print(firstItem)
print(lastItem)
print(indexZeroItem)
print(names[1...3])

5.2 집합

var emptySet: Set<String> = []
var names: Set<String> = ["dino", "chulsoo", "younghee", "dino"]

var numbers = [100, 200, 300] // type을 지정하지 않으면 []는 Array로 인식
print(type(of: numbers)) // Array<Int>

print(emptySet.isEmpty) // true
print(names.count) // 3

names.insert("jenny") // 새로운 값 추가
print(names.count) // 4

print(names.remove("chulsoo")) // Optional("chulsoo")
print(names.remove("john")) // nil -> 값이 없을 때 nil 리턴

집합 연산

let englishStudent: Set<String> = ["john", "chulsoo", "dino"]
let koreanStudent: Set<String> = ["jenny", "dino", "chulsoo", "hana", "minsoo"]

// 교집합 ["chulsoo", "dino"]
let intersectSet: Set<String> = englishStudent.intersection(koreanStudent)
print(intersectSet)

// 여집합의 합(배타적 논리합) ["john", "jenny", "minsoo", "hana"]
let symmetricDiffSet: Set<String> = englishStudent.symmetricDifference(koreanStudent)
print(symmetricDiffSet)

// 합집합 ["minsoo", "dino", "john", "chulsoo", "jenny", "hana"]
let unionSet: Set<String> = englishStudent.union(koreanStudent)
print(unionSet)

// 차집합 ["john"]
let subtractSet: Set<String> = englishStudent.subtracting(koreanStudent)
print(subtractSet)

// 오름차순 정렬 ["chulsoo", "dino", "hana", "jenny", "john", "minsoo"]
print(unionSet.sorted())

5.3 튜플

var person: (String, Int, Double) = ("dino", 29, 180.0)

// 인덱스로 값을 가져올 수 있음
// 이름: dino, 나이: 29, 신장: 180.0
print("이름: \\(person.0), 나이: \\(person.1), 신장: \\(person.2)")

// 인덱스로 값을 변경 할 수 있음
person.1 = 99
person.2 = 190.0

// 이름: dino, 나이: 99, 신장: 190.0
print("이름: \\(person.0), 나이: \\(person.1), 신장: \\(person.2)")
// index 대신 이름 지정해서 사용 가능
var person: (name: String, age: Int, height: Double) = ("dino", 29, 180.0)

// 인덱스로 값을 가져올 수 있음
// 이름: dino, 나이: 29, 신장: 180.0
print("이름: \\(person.name), 나이: \\(person.age), 신장: \\(person.height)")

// 인덱스로 값을 변경 할 수 있음
person.age = 99
person.height = 190.0

// 이름: dino, 나이: 99, 신장: 190.0
print("이름: \\(person.name), 나이: \\(person.age), 신장: \\(person.height)")

5.4 딕셔너리