[Swift] Array 의 property 와 method 를 알아보자 — 1
들어가기 전에
Array 문서 보면서 정리해야지~ 라고 생각한지 어언 두어달..
너무 기본적인 프로퍼티나 메서드들 말고, 몰랐던거나 흥미로운 것들 위주로 한번 걸러냈는데도 시간이 꽤 걸리네여.. 🥹🥹
너무 길면 정리하는 현재의 저도, 읽는 미래의 저도 둘 다 힘드니까 일단 좀 끊어서 올리겠읍니다
그럼 고고
Creating an Array
init(repeating: Element, count: Int)
let dummyData = "dummy"
요런 dummyData
세 개를 담고 있는 배열을 만들고 싶을때 어떻게 하셨나여?
let myArray1 = [dummyData, dummyData, dummyData]let myArray2 = (1...3).map { _ in dummyData }
이런 식으로 뭐 만드는 방법은 다양하겠지만, init(repeating: Element, count: Int)
생성자를 이용해서 value 를 원하는 만큼 반복해서 배열을 만들 수 있습니다
let myArray = Array(repeating: dummyData, count: 3)
Inspecting an Array
var capacity: Int
쓰다보니 내용이 좀 길어져서 [Swift] Array 의 capacity로 빼뒀슴다
Accessing Elements
subscript(Range) -> ArraySlice
myArray[0]
처럼 index 의 단일 요소에 접근 할 수 있는건 알았는데, 아래처럼 range 를 넘길 수도 있었네여
let streets = ["Adams", "Bryant", "Channing", "Douglas", "Evarts"]let streetsSlice = streets[2 ..< streets.endIndex]print(streetsSlice)// Prints "["Channing", "Douglas", "Evarts"]"
func randomElement() -> Element?
랜덤한 값을 반환합니다.
let names = ["Zoey", "Chloe", "Amani", "Amaia"]let randomName = names.randomElement()!// randomName == "Amani"
시스템 디폴트 random generator 을 넘겨서 randomElement(using:)
함수를 호출하는 것과 동일하다네요
만약 collection이 RandomAccessCollection
을 conform 하면 O(1), 그렇지 않으면 O(n) 의 complexity 를 갖습니다
Adding Elements
func replaceSubrange(Range, with: C)
배열에서 지정된 범위의 요소를 제거하고 동일한 위치에 새 elements를 삽입합니다.
이때 새로운 elements 의 개수가 제거 중인 elements의 수와 일치할 필요는 없습니다.
var nums = [10, 20, 30, 40, 50]nums.replaceSubrange(1...3, with: repeatElement(1, count: 5)) // [10, 1, 1, 1, 1, 1, 50]
코드로 보자면 요 배열의 중간에 있는 세개의 요소는 repeatElement(1, count: 5)
를 통해 다섯개 요소로 대체됩니다.
Complexity: O(n + m), n 은 array 의 길이, m 은 새로운 elements 의 길이
func reserveCapacity(Int)
지정된 수의 elements를 저장할 수 있는 공간을 예약하는건데,,! 얘두 [Swift] Array 의 capacity 글 읽으면서 이해하는게 더 좋을거 같아욤
Combining Arrays
static func + (Array, Array) -> Array
+
연산자를 이용해서 array 를 연결시킬 수 있습니다
var helloArray = ["hello"]var worldArray = ["world"]print(helloArray + worldArray) // ["hello", "world"]
static func += (inout Array, Array)
func append(contentsOf: S)
뿐만 아니라 +=
연산자를 이용해서도 array 를 연결시킬 수 있습니다
var helloArray = ["hello"]var worldArray = ["world"]helloArray += worldArrayprint(helloArray) // ["hello", "world"]
Removing Elements
func removeAll(keepingCapacity: Bool)
array 에서 모든 요소를 제거하는 함수인데여
myArray.removeAll()
여러분 혹시 얘가 keepingCapacity
를 인자로 받고 있는거 알고 계셨나요?
ㄷㄷ defualt value 가 지정되어 있어서 몰랐어여 저는..!
elements를 제거한 후 어레이의 기존 용량을 유지하려면 true
를 전달하라고 되어있네요 👀
Complexity: O(n), n은 array 의 길이
func popLast() -> Element?
마지막 element 를 삭제 및 반환한다는 점에서 removeLast()
와 동일합니다.
하지만 collection 이 empty 일때 removeLast
는 에러가 발생하지만, popLast
는 nil
을 반환한다는 차이가 있습니다.
var myArray: [String] = []myArray.removeLast() // 에러. Fatal error: Can't remove last element from an empty collectionmyArray.popLast() // nil
Finding Elements
func allSatisfy((Element) -> Bool) -> Bool
모든 요소가 주어진 조건을 충족하는지 나타냅니다
let names = ["Sofia", "Camilla", "Martina", "Mateo", "Nicolás"]let allHaveAtLeastFive = names.allSatisfy({ $0.count >= 5 })// allHaveAtLeastFive == true
func firstIndex(where: (Element) -> Bool) -> Int?
주어진 조건을 충족하는 첫번째 요소의 index 를 반환합니다.
let students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]if let i = students.firstIndex(where: { $0.hasPrefix("A") }) { print("\(students[i]) starts with 'A'!")}// Prints "Abena starts with 'A'!"
비슷하게 조건을 충족하는 첫번째 요소를 반환하는 func first(where: (Element) -> Bool) -> Element?
가 있는건 알았지만, 인덱스를 반환시킬수도 있었군요
func min(by: (Element, Element) -> Bool) -> Element?
주어진 조건으로 요소들을 비교하고, 그 중 최솟값을 반환합니다.
let hues = ["Heliotrope": 296, "Coral": 16, "Aquamarine": 156]let leastHue = hues.min { a, b in a.value < b.value }print(leastHue)// Prints "Optional((key: "Coral", value: 16))"
sort(by:)
함수에 조건을 넘겨주는 것과 비슷한 느낌이네요. min 이 있으면 당연히 func max(by: (Element, Element) -> Bool) -> Element?
도 있겠죠?
Selecting Elements
func prefix(Int) -> ArraySlice
처음 element 부터 시작해서 주어진 최대 개수만큼의 subsequence를 반환합니다.
let numbers = [1, 2, 3, 4, 5]print(numbers.prefix(2))// Prints "[1, 2]"
만약 array의 길이보다 더 큰 값을 넘겼다면, 그냥 array 의 모든 요소를 포함해서 반환합니다
let numbers = [1, 2, 3, 4, 5]print(numbers.prefix(10))// Prints "[1, 2, 3, 4, 5]"
만약 collection이 RandomAccessCollection
을 conform 하면 O(1), 그렇지 않으면 O(k) 의 complexity 를 갖습니다. k 는 컬렉션의 처음부터 선택할 아이템의 개수입니다.
func prefix(upTo: Int) -> ArraySlice
위의 prefix(_:)
가 "n 개 내놔!" 의 느낌이었다면, 이번 prefix(upTo:)
는 "i 인덱스까지 내놔! 대신 그건 빼고!" 의 느낌인데여
let numbers = [1, 2, 3, 4, 5]print(numbers.prefix(2)) // [1,2]print(numbers.prefix(upTo: 2)) // [1,2]
사실 array length 내의 element 를 요구하면 이 둘의 결과는 같슴다
하지만 범위 밖의 element 를 요구한다면? prefix(upTo:)
는 에러가 나버려여. 그러니까 사용에 유의하기!
let numbers = [1, 2, 3, 4, 5]print(numbers.prefix(10)) // [1, 2, 3, 4, 5]print(numbers.prefix(upTo: 10)) // ❗️ 에러
func prefix(through: Int) -> ArraySlice
위의 prefix(upTo:)
는 "i 인덱스까지 내놔! 대신 그건 빼고!" 의 느낌이라고 했잖아요?
이번 prefix(through:)
는 "i 인덱스까지 내놔! 그것도 포함해서!" 의 느낌입니다
let numbers = [1, 2, 3, 4, 5]print(numbers.prefix(upTo: 2)) // [1,2]print(numbers.prefix(through: 2)) // [1,2,3]
prefix(upTo:)
와 마찬가지로 범위 밖의 element 를 요구한다면 에러가 터집니다
Complexity: O(1)
func prefix(while: (Element) -> Bool) -> ArraySlice
이건 뭐~ 설명 필요하시술?
let numbers = [1, 2, 3, 4, 5].prefix { number in number < 3 }// [1,2]
func suffix(Int) -> ArraySlice
마지막 element 부터 시작해서 주어진 최대 개수만큼의 subsequence를 반환합니다.
만약 array의 길이보다 더 큰 값을 넘겼다면, 그냥 array 의 모든 요소를 포함해서 반환합니다
let numbers = [1, 2, 3, 4, 5]print(numbers.suffix(2))// Prints "[4, 5]"print(numbers.suffix(10))// Prints "[1, 2, 3, 4, 5]"
func suffix(from: Int) -> ArraySlice
“i 인덱스부터 끝까지 내놔!” 입니다
let numbers = [10, 20, 30, 40, 50, 60]if let i = numbers.firstIndex(of: 40) { print(numbers.suffix(from: i))}// Prints "[40, 50, 60]"
인덱스를 보는 순간 눈치채셨겠지만 얘도 array 범위 밖의 index 를 넘긴다면 에러가 터집니다
마무리
흠흠~~ 언제일지 모르겠지만 2탄으로 돌아올 수 있겠져!~~~
돌아온다면 여기에 링크를 첨부하겠습니다!ㅎㅎ
그럼 언제나처럼 도망쳐버리기~~!