나의 발자취
스위프트 컬렉션 (1) 배열 본문
1. 배열 (Array)
데이터를 순서대로 저장하는 컬렉션 (자동으로 순번 지정됨)
📌타입 표기
// 정식문법
let strArray1: Array<Int> = []
// 단축문법
let strArray2: [String] = []
📌빈 배열 생성
let emptyArray1: [Int] = [] // 명시적. 하지만 타입을 지우면 컴파일러가 알 수가 없어서 에러가 나기때문에 하나라도 입력하면 타입추론 가능.
let emptyArray2 = Array<Int>() // 괄호는 생성자를 의미함
let emptyArray3 = [Int]()
📌기본 기능
numsArray.count
numsArray.isEmpty
numsArray.contains(1) // 파라미터로 값을 전달
numsArray.randomElement()
numsArray.swapAt(0, 1) // 그 인덱스에 해당하는 값들의 위치를 바꿈
📌배열의 요소 접근
일반적으로 []; 서브스크립트 문법(대괄호를 이요한 특별한 함수)을 통해 접근한다.
// 배열의 시작, 마지막 값
stringArray.first // 리턴값은 옵셔널 (String?) -> 빈 배열이라면 nil 리턴
stringArray.last
// 배열의 시작, 마지막 인덱스
stringArray.startIndex // = stringArray[0]
stringArray.endIndex // Index out of range: 우리가 생각하는것보다 1이 큰 값이 나옴. 메모리가 끝나고 비어있는 끝의 주소가 나오기 때문.
stringArray.endIndex.advanced(by: -1) // 그러므로 endIndex를 쓸때는 항상 -1을 해주어야함.
//stringArray.index(i: Int, offSetBy: Int)
stringArray[stringArray.startIndex]
stringArray[stringArray.endIndex - 1]
// stringArray[stringArray.index(before: stringArray.endIndex)]
stringArray.firstIndex(of: "iOS") // 앞에서 부터 찾았을때 "iOS"는 배열의 (앞에서부터) 몇번째
stringArray.lastIndex(of: "iOS") // 뒤에서 부터 찾았을때 "iOS"는 배열의 (앞에서부터) 몇번째.
(주의) stringArray = ["Apple", "Swift", "iOS", "Hello", "iOS"] 에서 stringArray.lastIndex(of: "iOS") 는 4가 나온다.
if let index = stringArray.firstIndex(of: "iOS") {
print(index)
print(stringArray[index] )
}
📌배열의 삽입
배열에 접근연산자로 insert 함수를 찾으면 두개가 나온다.
// 앞 또는 중간에 삽입
// 한 개의 요소 삽입
alphabet.insert("c", at: 0)
//alphabet.insert("c", at: alphabet.endIndex)
// 여러개 삽입
alphabet.insert(contentsOf: ["a","b","c"], at: 0)
//alphabet.insert(contentsOf: ["a","b","c"], at: alphabet.endIndex)
📌배열의 교체
alphabet = ["A", "B", "C", "D", "E", "F", "G"]
1. 요소 교체하기
alphabet[0] = "a"
2. 범위를 교체하기
alphabet[0...2] = ["x", "y", "z"]
3. 원하는 범위 삭제
alphabet[0...1] = []
* 교체하기 함수 문법
alphabet.replaceSubrange(0...2, with: ["a", "b", "c"])
📌배열의 추가
alphabet += ["H"]
alphabet.append("H") // 맨 마지막에 추가하는 것
alphabet.append(contentsOf: ["H", "I"])
//alphabet.append(7) // 에러 ===> 동일한 자료형만 저장가능함
📌배열의 삭제
1. 서브스크립트 문법으로 삭제
alphabet[0...2] = [] //빈배열 전달하면 해당 범위가 삭제
2. 요소 한개 삭제
alphabet.remove(at: 2) // 삭제하고, 삭제된 요소 리턴
//alphabet.remove(at: 8) // 잘못된 인덱스 전달 ====> 에러발생
//alphabet.remove(at: endIndex - 1)
3. 요소 범위 삭제
alphabet.removeSubrange(0...2)
alphabet = ["A", "B", "C", "D", "E", "F", "G"]
alphabet.removeFirst() // 맨 앞에 요소 삭제하고 삭제된 요소 리턴 (리턴형 String)
alphabet.removeFirst(2) // 앞의 두개의 요소 삭제 ===> 리턴은 안함
alphabet.removeLast() // 맨 뒤에 요소 삭제하고 삭제된 요소 리턴 (리턴형 String)
alphabet.removeLast(2)
* 배열이 비어있는지도 잘 확인해보고 삭제(제거)해야함 ->에러
// alphabet.removeFirst() // 리턴형 String
// alphabet.removeLast() // 리턴형 String
4. 배열의 요소 모두 삭제(제거)
alphabet.removeAll()
alphabet.removeAll(keepingCapacity: true) // 저장공간을 일단은 보관해 둠. (안의 데이터만 일단 날림)
📌배열의 정렬
var nums = [1, 2, 3, 1, 4, 5, 2, 6, 7, 5, 0]
// 1) 배열을 직접정렬하는 메서드 sort (동사)
// 2) 정렬된 새로운 배열을 리턴 sorted (동사ing/동사ed)
nums.sort() // 배열을 직접 정렬 (오름차순) (배열리턴 하지 않음)
nums.sorted() //오름차순으로 정렬
nums.reverse() // 요소를 역순으로 정렬 (배열리턴 하지 않음)
nums.reversed()
nums.sorted().reversed()
// 새로운 배열은 생성하지 않고, 배열의 메모리는 공유하면서 역순으로 열거할 수 있는 형식을 리턴
📌배열 섞기
//nums.shuffle() // 요소의 순서 랜덤으로 직접 바꾸기
//nums.shuffled()
📌배열의 비교
let a = ["A", "B", "C"]
let b = ["a", "b", "c"]
a == b // false
a != b // true
// 개별요소 비교, 저장순서도 비교 하기 때문에
📌enumerate
// enumerated() -> 열거된 것들을 Named 튜플 형태로 한개씩 전달
// 데이터 바구니이기 때문에,
// 실제 번호표(index)까지 붙여서, 차례대로 하나씩 꺼내서 사용하는 경우가 많을 수 있어서 아래처럼 활용 가능
nums = [10, 11, 12, 13, 14]
for tuple in nums.enumerated() {
//print(tuple)
print("\(tuple.0) - \(tuple.1)") // 튜플의 성격을 이용하여 0: offset, 1: element 대신 사용
}
// (offset: 0, element: 10)
// (offset: 1, element: 11)
// (offset: 2, element: 12)
// (offset: 3, element: 13)
// (offset: 4, element: 14)
for (index, word) in nums.enumerated() { // 바로 뽑아내기
print("\(index) - \(word)")
}
for (index, value) in nums.enumerated().reversed() { // 거꾸로 뒤에서 부터
print("\(index) - \(value)")
}
// -14
// -13
// -12
// -11
// -10
'앱 개발 > iOS' 카테고리의 다른 글
스위프트 컬렉션(3) Set (0) | 2022.05.26 |
---|---|
스위프트 컬렉션(2) 딕셔너리 (0) | 2022.05.25 |
함수와 옵셔널타입 (0) | 2022.05.24 |
옵셔널 언래핑 Optional Unwrapping (0) | 2022.05.24 |
옵셔널이란? (0) | 2022.05.24 |