Array, Dictionary, Set을 합쳐놓은 것
mutable 가변형 - 값이 변함
immutable 불변형 - 값이 고정적임
상수에 할당하냐, 변수에 할당하냐에 따라 달라짐
배열은 하나의 "순서있는" 컬렉션에 여러 값을 담기 위한 데이터 타입임
배열의 타입은 type annotation으로 구체적으로 지정할 수 있고, type inference(타입 추론)로 컴파일러가 식별하게 할 수 있음
리터럴(literal) : 배열을 초기화할 때, 설정해 준 값을 리터럴 값이라고 함
원래 처음에 지정해준 타입의 값들만 들어갈 수 있지만 Any 타입으로 여러 타입의 값을 사용 가능
하지만, 선호하진 않음
var arr1 = [123, "KeeN", study()] as [Any] // 아무 타입 값이 가능한 배열
var arr2: [Any] = [123, "KeeN", study()] // 아무 타입 값이 가능한 배열
배열을 생성할 때 반드시 값을 할당할 필요 없음
var nameArray = [String]() // 빈 배열
var myArray = [String](repeating: "WOW", count: 10)
// WOW 문자열이 10개 포함된 배열 생성됨
var array1 = [1,3,4]
var array2 = [3,5,7]
var newArray = array1 + array2 // 동일한 타입의 값을 가진 배열끼리는 합칠 수 있음
Has-a 관계를 만들다보면 아래와 같은 형태로 배열을 사용함
struct School {
var grades: [Grade] = []
}
struct Grade {
var students: [Student] = []
}
struct Student {
var name: String = "KeeN"
}
func ageInfo(ages: [Int]) {
guard ages.count > 0 else { // 이 예시는 guard !ages.isEmpty else 로 바꿀 수 있음
print("배열에 아무것도 없을 때")
return // 여기서 함수가 종료됨
}
guard ages.count > 1 else {
print("배열에 하나만 들어가 있을 때")
return // 여기서 함수가 종료됨
}
print("나머지 나이는 여기로")
}
ageInfo(ages: [4,2,1]) // 나머지 나이는 여기로 출력
ageInfo(ages: []) // 배열에 아무것도 없을 때 출력
ageInfo(ages: [4]) // 배열에 하나만 들어가 있을 때 출력
if - else 문보단 swift 에서는 guard else 문으로 처음부터 걸러주는 역할을 함
기업에서 자주 활용하는 예시이니 익혀두면 좋을것임
array.randomElement() 를 활용하면 랜덤으로 하나를 뽑아옴
배열 안에 아무것도 없을 경우 nil이 출력되는데 이를 방지하기 위해 아래와 같은 코드를 사용함
array1.randomElement() ?? "배열이 비어 있습니다."
array.shuffle() 을 사용하면 배열 순서가 무작위로 변경됨
var shuffledNames = names.shuffled() // 이렇게 해야 원래 있던 names 배열이 그대로임
array.insert("KeeN", at: 1) 로 특정 인덱스 위치에 삽입 가능
가장 기본적인 삽입은 append()로 가능, array += ["KeeN"] 로도 가능
array.remove(at: 3) 로 특정 인덱스 위치의 값을 삭제 가능
array.removeLast()로 마지막 항목 삭제 가능
키-값(Key-Value) 쌍의 형태로 데이터를 저장하고 관리 가능한 컬렉션
키 값은 유일한 값이여야 함, Key값으로는 String, Int, Double, Bool 데이터 타입만 사용 가능
Dictionary는 "순서가 없는" 단일 컬렉션에 여러 값을 담기 위한 타입임
var bookDict: [String: String] =
["100-10" : "Book name 1",
"100-11" : "Book name 2",
"100-12" : "Book name 3",
"100-13" : "Book name 4"]
이름이 겹칠 경우 두가지의 방법으로 해결 가능함
var students: [[String: String]] = [
[
"names": "KeeN",
"message": "example"
],
[
"names": "KeeN",
"message": "example"
]
]
struct Student {
var name: String
var message: String
}
var students2: [Student] = [
Student(name: "KeeN", message: "example1"),
Student(name: "KeeN", message: "example2")
]
bookDict["100-1234"] = "새로운 책 제목"
bookDict["100-1234"] = nil // "100-1234"에 해당하는 키-값 삭제
bookDict.removeValue(forKey: "100-1234") // 위와 같은 결과를 얻음
var artist : [String] = [] // 아티스트를 담을 새로운 Array
for index in sumTeamDict {
artist.append(index.artist) // 아티스트 정보만 append
}
var resultDict = Dictionary(uniqueKeysWithValues: zip(1..., artist))
// 새로운 resultDict 이라는 딕셔너리 생성
// 키 값은 1부터 순서대로 주어짐
for (index, value) in resultDict {
print("index: \(index), value: \(value)")
}
var sortedDict = resultDict.sorted { $0.0 < $1.0 } // 딕셔너리 정렬
// $0과 $1은 각 딕셔너리 원소 하나를 의미
// .0은 그 원소의 첫 번째 친구, 즉 키값을 의미함
// { (first, second) in return first.key < second.key } 이 클로져의 축약본임
for (index, value) in sortedDict {
print("index: \(index), value: \(value)")
}