728x90
240222
240315
배열타입 선언하기
정식 문법
Array<String>
단축문법
[String]
//타입선언 - 아래 코드 다 같음
let emptyArray: [Int] = []
let emptyArray2 = Array<Int>()
let emptyArray3 = [Int]()
//==============
let emptyArray = [] //타입을 유추할 수 없어서 에러남
배열이 비어있는지 확인하는 법
isEmpty
let nums = [1, 2, 3]
nums.count //3
//=================
//배열이 비어있는지 확인
nums.count == 0 //이렇게도 확인할 수 있는데 //false
nums.isEmpty //isEmpty 를 사용하면 더 편리 함 //false
배열 요소에 접근하는 방법 (Accessing Elements)
서브스크립트 문법을 사용하는데, 두가지만 기억하면 된다 스퀘어브라켓[]과 인덱스
let fruits = ["Apple", "Banana", "Melon"] //
fruits[0] //첫번째 인덱스에 접근
fruits[2] //마지막 인덱스에 접근
fruits[0...1] //특정 범위 접근
이렇게 접근해도 되지만 만약에 인덱스 숫자를 잘못 입력한다면?
에러가 난다.
위에 fruit 배열에는 인덱스가 2까지 있기 때문에 이보다 큰 숫자를 입력하면 값이 없기 때문에 오류가 난다.
그래서 정수인덱스 대신에 속성으로 제공하는 인덱스를 사용하면 안전한 코드를 작성 할 수 있다.
startIndex
첫번째 인덱스 접근
index(before: .endIndex)
마지막 인덱스 접근
fruits[fruits.startIndex] //첫번째 인덱스 접근
//fruits[fruits.endIndex] //endIdex 는 배열의 마지막 뒤에 접근하기 떄문에 오류남
fruits[fruits.index(before: fruits.endIndex)] //마지막 인덱스 이전 인덱스 접근
이것보다 더 안전하게 접근하는 방법이 있다
아래 두개의 속성은 값이 없으면 nil 를 리턴하고 끝난다. 더 안전하게 접근 할 수 있음.
인덱스를 계산할 수고로움도 덜 수 있다
.first
.last
fruits.first
fruits.last
배열 범위를 지정해서 접근하는 방법
let list = ["A", "B", "C", "D", "E"]
list[0...2]
list[2...] //배열에서는 범위가 정해져 있으니까 one-sided range 를 사용할 수 있다
list[...2]
근데 배열이 100000000000000000개 라면? 끝도없이 배열을 받아오면 범위를 알 수 없다
그럴 땐 prifix 를 사용하면 된다
prefix
- 배열의 갯수만큼 새로운 배열을 리턴해준다
- 배열의 갯수보다 큰 값을 입력해도 배열에 있는 최대만큼만 리턴한다
//prefix 앞에서부터 추출
list.prefix(3) //앞에서부터 3개 리턴 ["A", "B", "C"]
list.prefix(upTo: 3) //upto: 인덱스 3전까지 리턴 ["A", "B", "C"]
list.prefix(through: 3) //through 인덱스 3까지 포함하여 리턴 ["A", "B", "C", "D"
//suffix 뒤에서부터 추출
list.suffix(3) //["C", "D", "E"]
list.suffix(from: 3) // ["D", "E"]
배열에 요소 추가하기 Adding elements
요소 추가: 기존 배열 뒤에 추가 된다
append
var mutableAlphabet = ["A", "B", "C"]
mutableAlphabet.append("E")
mutableAlphabet.append(contentsOf: ["F", "G"]) //여러개 동시에 추가 append(contentsOf: )
여담,, 우측에서 출력 안됨..
나랑 같은 생각 하신 분이 질문함
그래서 위에 처럼 창 다열어서 캡쳐하는점,,
중간에 추가
insert
mutableAlphabet.insert("D", at: 3) //at으로 추가할 위치 지정
mutableAlphabet.insert(contentsOf: ["a", "b", "c"], at: 0)
요소 바꾸기
//서브스크립트 문법으로 구현
mutableAlphabet[0...2] = ["x", "y", "z"]
//메소드로 구현
//첫번째 파라미터:바꿀범위, 두번째 파라미터: 새로운 배열전달
mutableAlphabet.replaceSubrange(0...2, with: ["x", "y", "z"])
삭제
빈 배열로 정렬하면 요소들이 삭제 된다
mutableAlphabet[0..<1] = []
print(mutableAlphabet)
요소 삭제하기 Removing Elements
var alphabet = ["A", "B", "C", "D", "E", "F", "G"]
alphabet.remove(at: 2) //잘못된 인덱스를 전달하지 않도록 조심해야한다
alphabet.removeFirst() // 숫자를 전달하지 않으면 리턴
alphabet.removeFirst(2) //숫자만큼 삭제하고 배열에 남은것, 리턴하지 않는다
alphabet.removeAll() //요소 전체 삭제. 배열이 비어있다면 오류가 발생한다
alphabet.popLast() //배열이 비어 있을 때 nil 를 전달함
alphabet = ["A", "B", "C", "D", "E", "F", "G"]
alphabet.popLast()
//지정 범위 삭제
alphabet.removeSubrange(0...2)
//서브스크립스 문법 사용 하여 삭제
alphabet[0...2] = []
alphabet = ["A", "B", "C", "D", "E", "F", "G"]
alphabet.dropFirst() //첫번째 요소 빼고 나머지 리턴
alphabet.dropFirst(3) //숫자만큼 빼고 나머지 리턴
//원본은 변화 없음
배열 비교
let a = ["A", "B", "C"]
let b = ["a", "b", "c"]
a == b //false
a != b //true
a < b //error 배열의 크기나 속성은 비교할 수 없다
메소드로 비교
elementsEqual()
a.elementsEqual(b) // false
클로저로 비교방식 직접구현
//대소문자 무시하도록 구현한 코드
a.elementsEqual(b, by: { (lhs, rhs) -> Bool in
return lhs.caseInsensitiveCompare(rhs) == .orderedSame
})
배열 검색 Finding Elements
.min
.max
가장 작은 값과 가장 큰 값 검색
let a = ["A", "B", "C"]
let randomNumbers = [1, 2, 3, 1, 4, 5, 2, 6, 7, 5, 0]
randomNumbers.min() // 0
a.min() //A 문자열도 아스키 코드로 인해 가장 작은 크기를 구할 수 있음
a.max() //C
contains
배열에 값이 있는지 확인함. 단순히 존재여부만 확인한다.
let randomNumbers = [1, 2, 3, 1, 4, 5, 2, 6, 7, 5, 0]
randomNumbers.contains(1) //true
//짝수가 포함되어 있는지 클로저로 구현
let r3 = randomNumbers.contains { $0.isMultiple(of: 2)} // true
.first
인덱스 혹은 요소 검색
가장 먼저 true 를 리턴하는 결과를 리턴함. 검색에 실패하면 nil 을 리턴한다.
let randomNumbers = [1, 2, 3, 1, 4, 5, 2, 6, 7, 5, 0]
//first(where: )
randomNumbers.first {
$0.isMultiple(of: 2) // 가장 처음의 짝수 리턴. 위 배열에선 2
}
//=========================
randomNumbers.firstIndex{
$0.isMultiple(of: 2) //첫번째 짝수 검색. 2의 '인덱스'가 리턴 됨. 위 배열에선 2가 첫번째 짝수이므로 2의 인덱스인 1이 리턴됨
}
//firstIndex(of: )
randomNumbers.firstIndex(of: 7) // 7의 인덱스 8이 리턴됨
//==========================
//첫번째 혹은 마지막 요소 검색. 해당요소의 인덱스 리턴
randomNumbers.firstIndex(of: 5) //5 첫번째 5는 인덱스5
randomNumbers.lastIndex(of: 5) //9 마지막 5는 인덱스 9
배열 정렬 Sorting on Array
sorted
새로운 배열 복사본에 정렬한 뒤 리턴
//오름차순
randomNumbers.sorted() // [0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7]
randomNumbers //원본배열은 그대로 있음
//내림차순 정렬
let sorted = randomNumbers.sorted { $0 > $1 }
sorted
//randomNumbers.sort()// let으로 선언한건 원본을 바꿀수 없다
var mutableNums = randomNumbers // var 로 다시 정렬함
//원본 오름차순 정렬
mutableNums.sort()
//내림차순 정렬
mutableNums.reverse()
swapAt
특정요소의 순서 정렬
mutableNums
mutableNums.swapAt(0, 1)
shuffle
순서 랜덤으로 정렬. 실행할 때 마다 순서가 달라진다
mutableNums.shuffle()
mutableNums.shuffled()
728x90
'iOS Swift > 문법' 카테고리의 다른 글
[Swift] Initializer (0) | 2024.03.07 |
---|---|
UITableViewDataSource, UITableViewDelegate (1) | 2024.02.28 |
[Swift] String Comparison & Searching (0) | 2024.02.21 |
[Swift] String Editing #2 (0) | 2024.02.21 |
[Swift] Optionals (0) | 2024.02.21 |
댓글