가변형 컬렉션, 불변형 컬렉션
- 불변형 컬렉션 인스턴스에 속한 것은 객체가 초기화된 이후 변경될 수 없음
- 불변형 컬렉션은 생성할 때 상수에 할당하면 됨
- 변수에 할당했다면 가변형 컬렉션
배열 초기화
- 배열 : 하나의 순서 있는 컬렉션에 여러 값을 담기 위하여 설계된 데이터 타입
- 배열은 동일한 타입들의 값들만 저장할 수 있음
- 배열의 타입은 타입 어노테이션을 사용한 구체적 지정과 타입 추론을 이용하여 컴파일러가 식별하게 할 수도 있음
- 배열을 생성할 때 값들을 갖도록 초기화 → 배열 리터럴
var 변수명 : [타입] = [값1, 값2, 값3 ... ]
- 세 개의 문자열 값으로 초기화되어 생성된 새로운 배열을 변수에 할당
// 타입 추론 형태
// 가변형
var treeArray = ["Pine", "Oak", "Yew"]
// 불변형
let treeArray = ["Pine", "Oak", "Yew"]
- 타입 어노테이션 활용
var treeArray : [String] = ["Pine", "Oak", "Yew"]
- 빈 배열 생성
var 변수명 = [타입]()
var priceArray = [Float]()
- 배열의 각 항목마다 지정된 디폴트 값으로 미리 설정하여 배열이 특정 크기로 초기화
var nameArray = [String](repeating: "My String", count : 10)
print(nameArray) // ["My String", "My String", "My String", "My String", "My String", "My String", "My String", "My String", "My String", "My String"]
- 배열 합치기 (동일한 타입의 값)
let firstArray = ["red", "blue", "green"]
let secondArray = ["Indigo", "Violet"]
let thirdArray = firstArray + secondArray
print(thirdArray) // ["red", "blue", "green", "Indigo", "Violet"]
배열 작업하기
- 항목 개수
var itemCount = treeArray.count
- 빈 배열 확인
treeArray.isEmpty
- 배열 항목 접근
- 인덱스 사용
treeArray[2] = "RedWood" // 값 교체
배열 항목 섞기, 무작위로 가져오기
- shuffled() 메서드 : 항목의 순서가 무작위로 섞인 새로운 버전의 배열 반환
let suffledTrees = treeArray.shuffled()
- randomElement() : 배열의 항목 무작위로 선택하여 접근
let randomTree = treeArray.randomElement()
배열에 항목 추가
- append 메서드, +, += 연산자를 이용하여 배열에 추가 가능
treeArray.append("Redwood")
treeArray += ["Redwood"]
treeArray += ["Redwood", "Mappled","Birch"]
항목 삽입, 삭제
- 배열 삽입 : insert(at: ) 메서드 사용 → 특정 인덱스 위치에 삽입 가능
- 새로 삽입될 인덱스 기준으로 기존 항목들은 오른쪽으로 한 칸씩 이동
- 삭제 : remove(at : ) 메서드 사용
- 마지막 항목 삭제 : removeLast()
// 항목 삽입
treeArray.insert("Mapple", at: 0)
// 항목 삭제
treeArray.remove(at: 2)
// 마지막 항목 삭제
treeArray.removeLast()
배열 반복하기
- for - in 문 사용
// 배열 반복
for tree in treeArray {
print(tree)
}
타입이 혼합된 배열 생성하기
- Any 타입 이용
- 지정된 클래스 타입이 아닌 객체를 참조하는 데 사용됨
let mixedArray : [Any] = ["A String", 123, 123.31]
- Any 타입을 사용할 때는 올바른 타입의 요소들이 배열에 포함되었다고 간주하게 되므로 코드 상에서의 프로그래머 실수로 인한 오류 발생 가능
- 코드에서 사용하기 전, 각 요소에 대한 올바른 타입으로의 형 변환을 직접해야 하는 경우가 있음
- 컴파일 오류는 발생하지 않지만, 런타임 충돌 발생
let mixedArray : [Any] = [1, 2, 45, "Hello"]
for object in mixedArray {
print(object * 10)
}
// error: binary operator '*' cannot be applied to operands of type 'Any' and 'Int'
→ Any 타입과 Int 타입의 곱셈 연산이 불가능함
- 이 오류를 없애려면 배열의 요소를 Int 타입으로 다운 캐스팅해야 함
// 다운캐스팅
let mixedArray : [Any] = [1, 2, 45, "Hello"]
for object in mixedArray {
print(object as! Int * 10)
}
/*
10
20
450
Could not cast value of type 'Swift.String' (0x1f6248898) to 'Swift.Int' (0x1f624aa48).
*/
→ 동작하다가 배열의 마지막 String 요소에 다다랐을 때 에러 메시지와 함께 충돌 발생
딕셔너리 컬렉션
- 키-값(key-value) 쌍의 형태로 데이터를 저장하고 관리
- 딕셔너리는 순서가 없는 단일 컬렉션에 여러 값을 담기 위해 설계된 데이터 타입
- 딕셔너리에 저장된 각 항목은 연관된 값을 참조하고 접근하는 데 사용되는 유일한 키 와 연결됨
- String, Int, Double, Bool 타입만 키로 사용 가능
딕셔너리 초기화
- 딕셔너리에 있는 각 항목은 키(key), 그와 곤련된 값(value)로 구성
- 키의 데이터 타입과 값 항목의 타입은 타입 어노테이션을 이용하거나 타입 추론을 이용
- 딕셔너리 리터럴
var 변수명 : [키 타입 : 값 타입] = [키1 : 값1, 키2 : 값2 ..... ]
- ISBN 번호와 그에 해당하는 책 제목 형태의 딕셔너리
var bookDict = ["100-432112" : "Wind in the Willows",
"200-532874" : "Tale of Two Cities",
"202-546549" : "Sense and Sensibility",
"104-109834" : "Shutter Island"]
var bookDict : [String : String] =
["100-432112" : "Wind in the Willows",
"200-532874" : "Tale of Two Cities",
"202-546549" : "Sense and Sensibility",
"104-109834" : "Shutter Island"]
- 키와 값 항목을 String 타입으로 사용
- 다른 타입의 키 또는 값이 삽입되지 못함
- 빈 딕셔너리 생성
var 변수명 = [키 타입 : 값 타입]()
var myDictionary = [Int : String]()
시퀀스 기반의 딕셔너리 초기화
- 키, 값을 나타내는 시퀀스를 이용하여 초기화 가능
- zip() 함수 사용
let keys = ["100-432112", "200-532874", "202-546549", "104-109834" ]
let values = ["Wind in the Willows", "Tale of Two Cities", "Sense and Sensibility", "Shutter Island"]
let bookDict = Dictionary(uniqueKeysWithValues: zip(keys, values))
- 미리 정의된 키 배열이 아닌 1부터 시작하는 숫자를 키로 설정
let values = ["Wind in the Willows", "Tale of Two Cities", "Sense and Sensibility", "Shutter Island"]
var bookDict2 = Dictionary(uniqueKeysWithValues: zip(1..., values))
// bookDick2와 같은 결과
var bookDict3 = [1 : "Wind in the Willows",
2 : "Tale of Two Cities",
3 : "Sense and Sensibility",
4 : "Shutter Island"]
딕셔너리 항목 개수
print(bookDict2.count)
항목 접근하기와 갱신하기
- 특정 값은 해당 키 잠조하여 첨자 구문 이용
- bookDict 딕셔너리에 키 값을 이용하여 해당 값 출력
print(bookDict["200-532874"]) // Optional("Tale of Two Cities")
- 지정된 키에 해당하는 값이 없는 경우 사용될 디폴트 값 선언
print(bookDict["999-123123", default: "Book not found"]) // Book not found
print(bookDict["200-532874", default: "Book not found"]) // Tale of Two Cities
- 항목 갱신하기
bookDict["200-532874"] = "Sense and Sensibility"
print(bookDict["200-532874", default: "Book not found"]) // Sense and Sensibility
- 변경될 값과 해당 키를 전달하여 update(forKey: ) 메서드 호출
bookDict.updateValue("The Runis", forKey: "200-532874")
print(bookDict["200-532874", default: "Book not found"]) // The Runis
딕셔너리 항목 추가하기와 제거하기
- 딕셔너리 항목추가
딕셔너리 변수[키] = 값
bookDict["300-898871"] = "The Overlook"
- 제거
- 해당 항목을 nil로 설정하거나 딕셔너리 인스턴스의 remove(forKey:) 메서드 호출
bookDict["300-898871"] = nil
bookDict.removeValue(forKey: "300-898871")
딕셔너리 반복
- for - in 반복문 사용
- 책 딕셔너리에 있는 모든 항목을 가져다가 각각의 키, 값을 출력
for (bookId, title) in bookDict {
print("Book ID : \(bookId) Title : \(title)")
}
/*
Book ID : 104-109834 Title : Shutter Island
Book ID : 100-432112 Title : Wind in the Willows
Book ID : 200-532874 Title : The Runis
Book ID : 202-546549 Title : Sense and Sensibility
*/
'Swift' 카테고리의 다른 글
Swift - Xcode 프로젝트 생성 (0) | 2024.06.24 |
---|---|
Swift - 10. 에러 핸들링 (0) | 2024.01.06 |
Swift - 8. 프로퍼티 래퍼 (0) | 2023.12.29 |
Swift - 7. 구조체 (0) | 2023.12.28 |
Swift - 6. 서브 클래싱과 익스텐션 개요 (0) | 2023.12.28 |