본문 바로가기

IOS Swift/Swift 공부 기록

Swift ArraySlice

 

var intArray = [1, 2, 3, 4, 5, 6, 7, 8]

var intSliceArray1 = intArray[2...3]
var intSliceArray2 = intArray[0...3]
var intSliceArray3 = intArray[0...]
var intSliceArray4 = intArray[..<4]

print(intSliceArray1, intSliceArray2, intSliceArray3, intSliceArray4, separator: "\n")
/* 
결과
[3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4]
*/

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

 

Apple Developer Documentation

 

developer.apple.com

 

 

ArraySlice는 Range<Int>, 그러니까 1...2, 3..<5 이런 형식을 [] 안에 넣어서 배열의 단일 값이 아닌 범위를 액세스 하는 문법입니다

여러가지 특징이 있는데 배열을 ArraySlice로 액세스 하면 해당 타입은 Array가 아닌

 Array<Int>.SubSequence

타입이 됩니다. 

 

또한 ArraySlice는 본래의 Array를 참조하고 있는 형태이므로 새로운 메모리를 사용하지 않는 장점이 있다고 합니다

다만 참조하고 있는 상태이기 때문에 오랫동안 방치하게 되면 Memory Leak이 발생할 수 있는 단점도 있습니다

주 용도는 배열 내부 값을 비교할 때 쓰는데 저는 코딩 테스트 문제를 풀 때 많이 사용합니다

 

 

var intArray = [1, 2, 3, 4, 5, 6, 7, 8]

var intSliceArray1 = intArray[2...3]
var intSliceArray2 = intArray[0...3]
var intSliceArray3 = intArray[0...]
var intSliceArray4 = intArray[..<4]

print(intSliceArray1, intSliceArray2, intSliceArray3, intSliceArray4, separator: "\n")
/* 
결과
[3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4]
*/

 

이런 식으로 사용할 수 있습니다

 

그리고 ArraySlice 타입으로 초기화 한 후 해당 타입을 사용할 때 주의사항이 있는데

print(intSliceArray1[1])
// 2...3 을 액세스 했기 때문에  Fatal error: Index out of bounds 가 발생합니다​

초기화한 ArraySlice 타입은 첫 인덱스가 0이 아닌 지정한 범위의 첫 번째 값이기 때문에 잘 살펴보고 참조해야 합니다

 

 

다른 타입으로 예시를 더 써보자면...

 

var stringArray = ["가", "나", "다", "라", "마", "바", "사"]

var stringSliceArray1 = stringArray[2...3]
var stringSliceArray2 = stringArray[0...3]
var stringSliceArray3 = stringArray[5...]
var stringSliceArray4 = stringArray[..<stringArray.count]
print(stringSliceArray1, stringSliceArray2, stringSliceArray3, stringSliceArray4, separator: "\n")

/*
결과

["다", "라"]
["가", "나", "다", "라"]
["바", "사"]
["가", "나", "다", "라", "마", "바", "사"]

*/


let scoreArray = [3.5, 4.0, 2.0, 4.5, 3.2, 4.3]
let mid = scoreArray.count / 2
let leftArraySum = scoreArray[..<mid].reduce(0, +)
let rightArraySum = scoreArray[mid...].reduce(0, +)

/*
결과 
3
9.5
12.0
*/

이런 식으로 count 접근이 가능하고, 고차함수도 사용이 가능합니다

 

https://github.com/500beckwon/SwiftBasic/blob/master/ArraySlice/ArraySlice/main.swift