100 Days of SwiftUI - Day 3
배열 Array
하나의 데이터타입을 연속적으로 저장하는 자료구조
var 변수이름 = [값1, 값2, 값3, …] let 상수이름 = [값1, 값2, 값3, …]
비어있는 배열을 생성하기 위해서는 타입을 명시해야 한다.
var 배열명 = Array<타입>()
또는 간단하게, var 배열명 = [타입]()
으로도 비어있는 배열 생성이 가능하다.
var scores = Array<Int>()
var heights = [Int]()
var strings: [String] = ["a", "b", "c"]
유용한 함수, 프로퍼티
Array.count
: 배열 원소의 개수를 리턴함Array.remove(at:Int)
: Int에 지정된 정수에 해당하는 인덱스에 있는 원소를 제거Array.removeAll()
: 배열에 있는 모든 원소를 제거Array.contains()
: 배열에 인수에 해당하는 원소가 저장되어 있는지? true/falseArray.sorted()
: 배열의 원소를 정렬해서 출력 (배열 자체가 정렬되는 것은 아님)Array.reversed()
: 배열을 뒤집은 결과를 리턴
딕셔너리 Dictonary
key-value의 형식으로 자료를 저장하는 구조
let employee = [
"name" : "Lee",
"age" : 24,
"height" : 170
]
딕셔너리에서 데이터를 읽어올 때는 딕셔너리의 key를 사용한다.
print(employee["name"])
print(employee["location"])
print(employee["height", default:"Unknown"])
>> Optional("Lee")
>> nil
key를 사용해 딕셔너리의 데이터에 접근을 시도하는 경우,
key에 해당하는 값이 존재하지 않을 가능성이 있다고 판단해 Optional로 래핑하여 결과를 반환한다.
key에 해당하는 값이 실제로 없는 경우 nil
을 반환한다.
default 인자에 값을 설정하여 key에 해당하는 값이 없는 경우 nil
대신 기본값을 반환하는 방법이 있다.
딕셔너리에 key에 해당하는 값이 있을거라 장담하지 말 것.
빈 배열을 생성하는 것과 비슷하게 빈 딕셔너리를 생성할 수 있다.
//key가 String형이고 value가 Int형인 빈 딕셔너리를 생성
var heights = [String:Int]()
heights["Lee"] = 170
heights["Seo"] = 201
딕셔너리에서는 key의 중복을 허용하지 않기 때문에, 이미 존재하는 key의 값을 수정하게 된다.
딕셔너리의 유용한 함수, 프로퍼티
배열과 마찬가지로, .count
와 .removeAll()
이 모두 사용 가능하다
세트 Set
세트는 배열과 비슷하지만, 중복 저장이 불가능하고 저장하는 순서가 정해져 있지 않은 자료구조이다.
let 세트명 = Set([데이터...])
빈 세트를 생성하는 방법 또한 배열과 비슷하다.
var s = Set<String>()
s.insert("Lee")
s.insert("Park")
s.insert("Kim")
빈 세트에 원소를 추가하는 함수는 .insert()
인데, 배열에서 사용하는 .append()
가 아니다.
.append()
는 자료구조의 맨 끝에 원소를 추가하지만, .insert()
는 자료구조 안의 아무 곳에나 원소를 삽입하기 때문이다.
세트를 사용하는 경우
- 원소의 중복 저장이 허용되지 않을 때
- 특정 원소를 빠르게 찾고 싶은 경우
.contains()
함수 사용 시 차이를 확인할 수 있다.
배열은 맨 앞부터 시작하여 원소를 찾을 때까지 순서대로 검사를 하지만,
세트는 그에 반해 빠르게 원소를 찾을 수 있다.
이 특징은 자료구조 내에 원소가 매우 많을 때 (ex.1000개 이상) 차이가 두드러진다.
대부분은 배열을 사용하겠지만 특정 문제에 따라서 세트를 사용하는 것이 더 유리할 때도 있다.
열거형 Enum
여러 줄에 걸쳐 정의하는 경우, case 케이스명
한 줄에 여러 열거형을 정의하는 경우 콤마(,
)로 구분
값의 범위가 고정되어 있는 경우 사용하면 편함.
//여러 줄에 걸쳐 케이스를 정의하는 경우
enum Weekday {
case monday
case tuesday
case wednesday
case thursday
case friday
}
var day = Weekday.monday
day = Weekday.friday
--- 또는 ---
//한줄에 케이스를 정의하는 경우
enum Weekday {
case monday, tuesday, wednesday, thursday, friday
}
변수에 열거형을 할당하면 변수는 열거형 타입으로 추론된다. 다른 타입의 값을 할당할 수는 없지만, 편하게 값을 변경할 수 있다.
var day = Weekday.monday
//Weekday와 같은 열거형 타입을 입력하지 않아도 된다.
day = .friday
day = .thursday
swift 내부적으로는 열거형을 정수로 저장한다. 0,1,2…
참고: https://www.hackingwithswift.com/100/swiftui/3