Featured image of post Array와 자주 사용하는 메서드

Array와 자주 사용하는 메서드

배열 생성하기

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13

let emptyArray: [Int] = [1, 2, 3]
let emptyArray1: [Int] = [] // 빈 배열 생성

let emptyArray2 = Array<Int>()
let emptyArray3 = [Int]()

let anyArray = [Any] = [1, 2, "three", 4.0] // Any 타입으로 여러 자료형을 묶을 수도 있다.

let nums = Array(1...3) // [1, 2, 3] // 범위 연산자 사용 가능

// (repeating: 배열의 타입과 일치하는 값(1개), count: 값을 반복할 횟수)
let emptyArray4 = [Int](repeating: 0, count: 10) // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

배열 갯수 확인

1
2
3
4
5
var numbers = [1, 2, 3]

let count: Int = numbers.count // 배열 갯수 확인 : 3
let isEmpty: Bool = numbers.isEmpty // 배열이 비어있는지 확인 : false
// numbers.count == 0 을 사용할 수도 있지만 numbers.isEmpty도 가능

배열 요소 접근

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
var emptyArray: [Int] = []
var numbers = [1, 2, 3]

// Subscript로 접근
numbers[0] // 1
numbers[1] // 2

// 범위로 접근
numbers[0...1] // [1, 2]

// 속성으로 접근
numbers.first // Optional(1)
numbers.last // Optional(3)
emptyArray.first // nil - 배열이 비어있다면 nil을 반환

numbers[numbers.startIndex] // 1
numbers[numbers.endIndex] // error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
// endIndex는 배열의 마지막 인덱스가 아님!!

numbers[numbers.index(before: numbers.endIndex)] // 3

❓ endIndex

The array’s “past the end” position—that is, the position one greater than the last valid subscript argument.

공식문서에서는 endIndex를 배열의 끝을 지난 인자 라고 정의하고 있다;

1
2
3
4
5
var numbers = [10, 20, 30, 40, 50]
if let i = numbers.firstIndex(of: 30) {
    print(numbers[i ..< numbers.endIndex])
}
// Prints "[30, 40, 50]"

배열에 요소 추가하기(append, insert)

1
2
3
4
5
6
7
// 1. append : 배열 끝에 추가
numbers.append(4) // [1, 2, 3, 4]
numbers.append(contentsOf: [5, 6]) // [1, 2, 3, 4, 5, 6]

// 2. insert : 중간에 추가
numbers.insert(0, at: 0) // [0, 1, 2, 3, 4, 5, 6]
numbers.insert(contentsOf: [10, 100], at: 2) // [0, 1, 10, 100, 2, 3, 4, 5, 6]

insert를 사용하는 경우 배열을 재배치 해야 하기 때문에 오버헤드가 발생한다.

배열 요소 삭제하기(remove)

1
2
3
4
5
6
7
8
9
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()               // []
함수 이름 용도 리턴 타입
remove(at:) 파라미터로 받은 index에 해당하는 값 삭제 삭제된 값 리턴, Non-Optional Type
removeFirst 첫 번째 요소 삭제 삭제된 값 리턴, Non-Optional Type
removeFirst(_:) 첫 번째 요소부터 파라미터로 받은 갯수 만큼 삭제 X
removeLast 마지막 요소 삭제 삭제된 값 리턴 , Non-Optional Type
popLast 마지막 요소 삭제 삭제된 값 리턴, Optional Type
removeLast(_:) 마지막 요소부터 파라미터로 받은 갯수 만큼 삭제 X
removeAll 전체 요소 삭제 X

특정 범위 삭제하기

1
2
3
4
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]
함수 이름 용도 리턴 타입
removeSubrange(_:) 파라미터로 받은 범위만큼 index 요소 삭제 X
[n...m] = [] Subscript 문법으로 n ~ m까지 index 요소 삭제 X

배열 비교하기(elementsEqual)

1
2
3
4
5
6
var array1 = [1, 2, 3]
var array2 = [1, 2, 3]
var array3 = [1, 2, 3, 4, 5,]

array1 == array2                    //true
array1.elementsEqual(array3)        //false

elementsEqual모든 요소가 똑같아야 true를 리턴한다.

배열 요소 검색(contains)

contains(_:)을 사용하여 특정 값이 포함되어 있는지를 확인할 수 있다. Bool 타입으로 알려준다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
let numbers = Array(1...10) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

numbers.contains(1) // true

numbers.contains {
    number in number % 2 == 0 // true - 짝수가 하나라도 있으면 true
}

numbers.first { // 클로저 조건을 만족하는 첫번째 `값`을 리턴, 없으면 nil
   bnumber in number % 2 == 0 // Optional(2)
}

numbers.firstIndex { // 클로저 조건을 만족하는 첫번째 `인덱스`를 리턴, 없으면 nil
   number in number % 2 == 0 // Optional(1)
}

배열 정렬하기 (sort, sorted)

1
2
3
4
5
6
7
8
9
var numbers = [1, 5, 3, 8, 6, 10, 14]

// sort - 배열을 직접 정렬
numbers.sort() // [1, 3, 5, 6, 8, 10, 14] 오름차순
numbers.sort(by: >) // [14, 10, 8, 6, 5, 3, 1] 내림차순

//sorted - 원본은 그대로 두고, 새로우누 배열을 만들어 리턴
let sortedArray = numbers.sorted() // [1, 3, 5, 6, 8, 10, 14] 오름차순
let sortedArray2 = numbers.sorted(by: >) // [14, 10, 8, 6, 5, 3, 1] 내림차순

배열 요소 섞기(shuffle, shuffled)

1
2
3
4
5
var numbers = [1, 2, 3, 4, 5]

numbers.shuffle() // [4, 1, 5, 3, 2]

let shuffleNumbers = numbers.shuffled() // [5, 2, 1, 3, 4]

배열 요소 위치 바꾸기(swapAt)

1
2
var numbers = [1, 2, 3, 4, 5]
numbers.swapAt(0, 4) // 0과 4 인덱스 변경 [5, 2, 3, 4, 1]

함수 이름 참고사항 (-ed, -ing)

Swift에서 보통 함수 이름에 -ed, -ing가 붙는 것들은 원본은 그대로 두고, 새로운 것을 리턴함!

Reference

https://developer.apple.com/documentation/swift/array

https://developer.apple.com/documentation/swift/array/endindex

https://developer.apple.com/documentation/swift/array/shuffle()

https://developer.apple.com/documentation/swift/string/shuffled()

https://axe-num1.tistory.com/19

https://soooprmx.com/swift-array-01-%EC%83%9D%EC%84%B1%EA%B3%BC-%EC%A1%B0%EC%9E%91/

https://babbab2.tistory.com/92?category=828998