배열은 단일 값으로 저장되는 값의 모음입니다.
배열을 사용하기 위해서는 []
괄호를 사용합니다.
각 값들은 ,
로 구분합니다.
let array: [Any] = [1, "error", 2]
❌ 존재하지 않는 항목을 읽으면 스위프트는 crash가 발생합니다.
배열의 각 항목의 위치는 0부터 시작합니다.
배열이 필요한 이유?
많은 값들을 저장하기 원할 때 편리하게 사용할 수 있습니다. 다른 타입처럼 상수와 변수를 만들 수 있습니다.
스위프트의 배열은 원하는 만큼 크기를 줄이고 늘릴 수 있습니다. (가변적이다.)
세트의 사용방법
Set
키워드를 사용한 후 ()
괄호 안에 배열 값을 저장
세트는 배열과 두가지 차이점을 빼고는 동작하는 방식이 같습니다.
let colors: Set<String> = Set(["red", "green", "blue", "red", "blue"])
// console
// ["blue", "green", "red"]
만약 중복된 값을 저장한다면 중복된 항목은 제외하고 저장됩니다. (crash발생하지 않는다.)
또한 세트는 배열에서와 같이 항목의 위치를 사용하여 값을 읽을 수 없습니다.
💡 세트는 실제로는 랜덤으로 순서가 지정된 게 아니고 처음부터 순서가 지정되지 않은 것
세트를 언제 필요할 까?
세트는 추가 한 순서대로 객체를 저장할 필요가 없기 때문에 빠른 검색을 위해 최적화하는 무작위 순서로 객체를 저장할 수 있습니다.
예를 들어, 세트에 항목이 포함되어있는지 확인할 때 찾는 속도가 빠릅니다.
반면에 배열은 순서대로 항목을 저장하기 때문에 지정한 순서대로 항목을 저장한 후 첫번째부터 확인을 하기 때문에 속도가 느립니다.
→ 즉, 중복된 단어가 없고 빠른 조회를 원할 때 사용하면 유용하다.
var name: (first: String, last: String) = (first: "Taylor", last: "Swift")
name.first
name.0
name.first = "hello"
name.first
print(name)
튜플과 배열의 차이점
튜플은 변경할 수 없는 고정된 집합인 반면, 배열은 추가 삭제가 자유롭습니다.
튜플은 naming을 사용하여 읽을 수 있기 때문에 더 구체적입니다.
또 다른 장점은 여러가지 타입을 단일 값으로 결합할 수 있습니다.
var person = (name: "Paul", age: 40, isMarried: true)
딕셔너리는 배열과 같은 값의 집합이지만 key-value를 사용하여 값을 저장합니다.
딕셔너리의 사용방법은 []
를 사용하고 각 항목은 ,
로 구분됩니다.
let heights: [String: Double] = [
"Taylor Swift": 1.78,
"Ed Sheeran": 1.73
]
heights["Ed Sheeran"]
딕셔너리가 있는 이유?
딕셔너리는 추가하려는 항목을 식별할 수 있는 key를 선택할 수 있지만 배열은 각 항목을 순서대로 추가합니다.
key를 사용하기 때문에 값에 접근할 때 편리합니다. 또한 특정 순서로 항목을 저장하지 않으므로 빠른 검색을 할 수 있습니다.
스위프트는 딕셔너리에 key가 없다면 nil을 반환합니다.
딕셔너리에 없는 key에 접근했을 때 nil을 반환하지 않고 default기본값을 설정할 수 있습니다. 설정하면 default 값이 반환됩니다. 딕셔너리에 존재하는 key에 접근하면 맞는 값이 반환됩니다.
let favoriteIceCream = [
"Paul": "Chocolate",
"Sophie": "Vanilla"
]
favoriteIceCream["Charlotte", default: "Unknown"]
default 값을 제공하는 이유?
딕셔너리에 없는 key에 접근해서 nil이 반환된다면 코드에 문제가 발생할 수 있고 문제가 발생했을 때 찾는 데 유용할 수 있습니다.
배열, 세트, 딕셔너리는 컬렉션이라고 합니다.
빈 컬렉션을 만들려면 타입 뒤에 ()
를 입력합니다.
// 빈 딕셔너리 생성
var teams = [String: String]()
var scores = Dictionary<String, Int>()
// 항목 추가
teams["Paul"] = "Red"
// 빈 배열 생성
var results = [Int]()
var stringResults: [String] = []
var intResults = Array<Int>()
// 빈 세트 생성
var words = Set<String>()
var numbers = Set<Int>()
빈 컬렉션을 만드는 이유
배열이 생성될 때 모든 항목을 알고 있는 경우도 있을 수 있지만, 데이터를 계산하여 추가하는 경우도 있기 때문에 사용합니다.
열거형은 사용하기 쉽게 관련 값들을 그룹으로 정의하는 방법입니다.
사용 방법은 enum
키워드를 사용하고 {}
괄호안에 case
항목들을 정의합니다.
각 항목은 중복되지 않아야 합니다.
let result = "failure"
let result2 = "failed"
let result3 = "fail"
enum Result {
case success
case failure
}
let result4 = Result.failure
열거형을 사용하면 주어진 항목내에서 선택하기 때문에 실수를 방지할 수 있습니다.
주어진 항목에 없는 것을 선택하면 에러가 발생합니다.
열거형은 단순히 값을 저장할 뿐만 아니라 각 case
에 연관된 값을 저장할 수 있습니다.
연관된 값을 저장하므로 정보를 추가할 수 있습니다.
일부 case
에만 연관된 값을 저장해도 되고, 모든 case
에 저장하여도 문제가 없습니다.
enum Activity {
case bored
case running(destination: String, startTime: Int)
case talking(topic: String)
case singing(volume: Int)
}
let talking = Activity.talking(topic: "football")
let singing = Activity.singing(volume: 2)
열거형에 직접 값을 할당 할 수 있습니다.
사용방법은 타입을 선언합니다.
enum Planet: Int {
case mercury = 1
case venus
case earth
case mars
}
let earth = Planet(rawValue: 3)
열거형의 원시값(rawValue)에서 숫자를 사용하는 경우 스위프트는 0부터 시작하는 숫자를 자동으로 할당합니다.
위 코드에서 첫번째 case
원시값을 1로 저장한다면 1이후 숫자를 할당합니다.
원시값은 중복되지 않는 값을 가져야 합니다.