배열(Array)
배열 비었는지 확인 방법
var array1 = [1,2,3]
let isEmpty: Bool = array1.isEmpty // false
배열에 요소 추가하기
1. append : 끝에 추가
var array1 = [1,2,3]
array1.append(4) //[1, 2, 3, 4]
array1.append(contentsOf: [5,6,7]) //[1, 2, 3, 4, 5, 6, 7, 8]
2. inset : 중간에 추가
var array2 = [1,2,3]
array2.insert(0, at: 0) //[0, 1, 2, 3]
array2.insert(contentsOfL [10, 100], at : 2) //[0, 1, 10, 100, 2, 3]
배열에 요소 변경하기
// 1. Subscript로 변경하기
var array1 = [1, 2, 3]
array1[0] = 10 // [10, 2, 3]
array1[0...2] = [10, 20, 30] // [10, 20, 30]
array1[0...2] = [0] // [0]
array1[0..<1] = [] // []
// 2. replaceSubrange로 바꾸기 (범위 변경 시)
var array2 = [1, 2, 3]
array2.replaceSubrange(0...2, with: [10, 20, 30])
array2.replaceSubrange(0...2, with: [0])
array2.replaceSubrange(0..<1, with: [])
배열 요소 삭제
// 1. 일반적인 삭제하기
var array1 = [1,2,3,4,5,6,7,8,9]
array1.remove(at: 2) // [1,2,4,5,6,7,8,9]
array1.removeFirst() // [2,4,5,6,7,8,9]
array1.removeFirst(2) // [5,6,7,8,9]
array1.removeLast() // [5,6,7,8]
array1.popLast() // [5,6,7]
array1.removeLast(2)// [5]
array1.removeAll() // []
// 2. 특정 범위 삭제하기
var array2 = [1,2,3,4,5,6,7,8,9]
array2.removeSubrange(1...3) // [1,5,6,7,8,9]
array2[0..<2] = [] // [6,7,8,9]
배열 비교하기
// 배열 비교하기
var array1 = [1,2,3]
var array2 = [1,2,3]
var array3 = [1,2,3,4,5]
array1 == array2 //true
array1.elementsEqual(array3) //false
배열 정렬하기
let array1 = [1, 5, 3, 8, 6, 10, 14]
// 1. sort : 배열을 직접 "오름차순"으로 정렬
array1.sort()
// 1-1. sort + 클로저 : 배열을 직접 "내림차순"으로 정렬
array1.sort(by: >)
// 1-2. sort + 클로저 : 배열을 직접 "오름차순"으로 정렬
array1.sort(by: <)
// 2. sorted : 원본은 그대로 두고, "오름차순"으로 정렬된 새로운 배열을 만들어 리턴
let sortedArray = array1.sorted()
// 2-1. sorted + 클로저 : 원본은 그대로 두고, "내림차순"으로 정렬된 새로운 배열을 만들어 리턴
let sortedArray2 = array1.sorted(by: >)
세트(Set)
- set은 쉽게 말해 집합을 생각하면 된다.
- set은 순서를 정의하지 않고 동일한 탕비의 값을 저장한다.
- 항목의 순서가 중요하지 않거나 항목이 한 번만 표시되도록 해야 하는 경우 배열 대신 집합을 사용할 수 있다.
- 세트 안에 있는 모든 고유(unique)해야하므로 중복을 허용하지 않는다.
var letter = Set<String>()
//값 넣기
letters.insert("Classical Music")
//초기화
letters = []
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
favoriterGenres.isEmpty // false -> Swift에서 isEmpty는 컬렉션이나 문자열 등이 비어 있는지를 확인하는
//프로퍼티이다.
favoriterGenres.count // 3 // 몇 개의 배열이 들어있는지 카운팅
favoritedGenres.contains("Rock") // true -> 들어있는지 확인 true/false로 출력
favoriterGenres.randomElement() // 랜덤으로 나옴
- 업데이트 - 삽입, 교체, 추가
// set에는 배열에서 사용하는 append가 없다
var set1: Set<Int> = [1,1,2,2,3,3]
set1.update(with: 1) // 1 -> 기존에 있던 요소이므로 값을 옵셔널 타입으로 리턴
set1.update(with: 7) // nil -> 기존에 없던 요소이므로 Set에 요소가 추가되고 nil을 리턴
set1.remove(1) // 1 -> 삭제된 요소를 리턴
set1 // [2,3,7]
set1.remove(5) // nil -> 존재하지 않는 요소를 삭제했을 때 에러는 발생하지 않고 nil 리턴
// 전체요소 삭제
set1.removeAll()
set1.removeAll(keepingCapacity: true) // 요소는 제거하지만 메모리는 제거하지 않는다.
- 집합 정리
let oddDigits: Set = [1,3,5,7,9]
let evenDigits: Set = [0,2,4,6,8]
let singleDigitPrimeMumbers: Set = [2,3,5,7]
// 합집합
oddDigits.union(evenDigits).sorted()
//[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
// 교집합
oddDigits.intersection(evenDigits).sorded()
//[]
// 차집합
oddDigits.sybtracting(singleDigitPrimeNumbers).sorted()
//[1,9]
// 대칭 차집합
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1,2,9]
딕셔너리 (Dictionary)
- Dictionary는 사전을 생각하면 쉽다.
- Dictionary는 순서를 정의하지 않고 같은 타입의 Key와 같은 타입의 value를 저장한다.
- key는 중복될 수 없다.
- 모든 key는 같은 타입이어야 한다.
- 모든 value는 같은 타입이어야 한다.
- key와 value는 다른 타입이어도 된다.
- 실물 사전을 찾는 것 처럼 순서가 아닌 식별자 기준으로 값을 찾을 때 Dictionary를 사용한다.
var namesOfIntegers: [Int: String] = [:]
nameOfIntegers[16] = "sixteen" // 16은 서브스크립트가 아니라 "키"이다.
// 키가 뭐지? -> 딕셔너리 내의 값을 식별하는 데 사용되는 고유한 식별자.
// 초기화
nameOfIntegers = [:]
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
airports.keys // ["YYZ", "DUB"]
airports.values // ["Toronto Pearson", "Dublin"]
airports.keys.sorted() //["DUB", "YYZ"]
airports.values.sorted() //["Dublin", "Toronto Pearson"]
airports["APL"] = "Apple International"
// airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin", "APL": "Apple International"]
// key에 매칭된 value 값 초기화
airports["APL"] = nil
//해당 key가 없다면 그 key에 해당하는 value에 값을 추가하고 nil을 반환
let newApl = airports.updateValue("Hello APL", forKey: "APL")
print(newApl) // 출력값: nil
print(airports["APL"]) // 출력값: Optional("Hello APL")
// 마지막 부분 의문 : 예를 들어 let newApl를 print했을 때 nil이 반환 되었는데, 이유는 뭐지?
답변 : 'newApl'이 'nil'인 이유는 "APL"키가 'airports' 딕셔너리 이전에 존재하지 않았기 때문이다.
그래도 의문인 점은 let newApl = airports.updateValue("... 생략") 부분에서 이미 추가를 해준 것이고 그렇게 따지면 print(airports["APL"])에서도 안 나와야 맞는거 아니야?
적고 나서 보니까 내가 무슨 소리를 하는 건지도 잘 모르겠다. 정리하면, let newApl = airports.updateValue("... 생략") 부분에서 메서드는 키가 존재하지 않으면 'nil'을 반환하고, 새 값을 추가한다. 라는 부분에서 이미 추가 된 상태니까 nil이 출력되는 것이 아니라 정상적으로 print되어야 하지 않나 생각 되어서 의문이 든 것 같다.
답변은 다음과 같다.
- 'updateValue(_:forKey:)'메서드가 'nil'을 반환한 이유는 호출 당시 "APL"키가 딕셔너리에 존재하지 않았기 때문이다.
- 메서드 호출 후"APL"키와 "Hello APL"값이 딕셔너리에 추가되었기 때문에, 이후 airports["APL"]를 통해 값을 접근하면 "Hello APL"이 반환된다.
따라서 이전에 값이 없었기 때문에 'nil'이 반환되었던 것이고, 이와 별개로 값은 딕셔너리에 추가되었으므로 이후 접근할 때는 새로 추가된 값이 반환되는 것 이다.
'Swift' 카테고리의 다른 글
내가 볼려고 만든 SOLID정리 (0) | 2024.06.07 |
---|---|
문법 기초 공부 (객체 지향) (1) | 2024.06.05 |
문법 기초 공부 (스택&큐) (0) | 2024.06.05 |
문법 기초 공부 (0) | 2024.06.03 |
[iOS Swift] Map, Filter, reduce 함수 (고차 함수) (0) | 2024.05.09 |