안녕하시와용!
째에요! 🫧
오늘은 Array의 prefix
와 suffix
에 대해서 알아볼려고 합니다.
애플 문서의 Array 파트의 Selecting Elements에 대한 정리로 prefix
와 suffix
를 정리해놓았더라구요.
prefix
/ suffix
는 Array 인스턴스 메소드이지만 SubSequence로 리턴하고 있는 것을 볼 수 있어요.
SubSequence
란 Collection의 요소의 연속적인 Subrange를 나타내는Collection
입니다.
즉, 자기 자신을 정의하지 않은 Collection에서의 subsequence 타입은 Slice
이죠!
아래 예시를 통해 prefix
의 결과가 ArraySlice
타입으로 return하는 것을 볼 수 있어요!
let arr = [1, 2, 3, 4].prefix(3)
type(of: arr) //ArraySlice<Int>
때문에 array 타입으로 사용하고 싶다면
let arrA = Array(arr)
type(of: arrA) //Array<Int>
이렇게 Array()
함수로 한번더 감싸야 해요.
먼저 prefix의 4가지 종류에 대해서 알아봅시다.
: **Array[]의 앞에서부터 maxLength 길이를 가진 subsequence
let arr = [1, 2, 3, 4]
print(arr.prefix(-1)) // error
print(arr.prefix(0)) // []
print(arr.prefix(1)) // [1]
print(arr.prefix(2)) // [1, 2]
print(arr.prefix(3)) // [1, 2, 3]
print(arr.prefix(4)) // [1, 2, 3, 4]
print(arr.prefix(5)) // [1, 2, 3, 4]
print(arr.prefix(100)) // [1, 2, 3, 4]
maxLength의 값이 Array의 최대 길이를 넘더라도 오류가 뜨지 않는 것을 볼 수 있습니다.
단, maxLength는 최대로 출력할 수 있는 배열의 길이이기 때문에 0보다는 크거나 같아야 합니다.
따라서 maxLength의 인덱스 범위는 (0…) 입니다.
: Array[0…through]의 subsequence
let arr = [1, 2, 3, 4]
print(arr.prefix(through: -2)) // error
print(arr.prefix(through: -1)) // []
print(arr.prefix(through: 0)) // [1]
print(arr.prefix(through: 1)) // [1, 2]
print(arr.prefix(through: 3)) // [1, 2, 3, 4]
print(arr.prefix(through: 5)) // error
여기서의 through는 인덱스를 의미하는 것이기 때문에 반드시 Valid한 Index를 넣어야 합니다.
여기서 -1를 넣는다면, 빈 Array가 나오지만, -2를 넣는다면 에러가 생깁니다.
따라서 through의 인덱스 범위는 (-1..<Array.count) 입니다.
위의 maxLength와의 차이점을 느끼시나요?
maxLength는 개수를 의미하는 것이었다면,
through는 자신의 인덱스 번호를 의미하는 것입니다.
자 그럼 upTo도 알아보죠.
: Array[0..<upTo]의 subsequence
let arr = [1, 2, 3, 4]
print(arr.prefix(upTo: -2)) // error
print(arr.prefix(upTo: -1)) // error
print(arr.prefix(upTo: 0)) // []
print(arr.prefix(upTo: 1)) // [1]
print(arr.prefix(upTo: 3)) // [1, 2, 3]
print(arr.prefix(upTo: 4)) // [1, 2, 3, 4]
print(arr.prefix(upTo: 5)) // error
위의 through와의 차이점이 보이시나요?
-1은 범위를 벗어나서 출력이 되지 않습니다.
자기 자신의 인덱스 앞까지 출력하는 것이기 때문에 4까지 출력해도 문제가 없겠죠?
따라서 upTo의 인덱스 범위는 (0…Array.count) 입니다.
through는 자기 자신의 인덱스 번호를 포함하는 것이고,
upTo는 자기 자신의 인덱스 번호를 포함하지 않는다는 것입니다.
upTo는 “~까지” 라는 의미를 가지고 있는 영어 단어로 0부터 자기 자신의 인덱스 전까지의 subsequence를 출력합니다.
Prefix
에도 Closure
를 넣을 수 있답니다.
실행은 간단해요!
요소를 포함해야하는 경우엔 true
, 요소를 제외해야하면 false
를 반환하죠.
하지만, false
를 반환한다면 다시 호출되지 않아요!
let arr1 = [ 4, 5, 6, 3, 2, 1]
print(arr1.prefix(while: { $0 >= 4 })) // [4, 5, 6]
첫번째 element의 4는 4보다 크거나 같으니 true
반환
두번째 element의 5는 4보다 크거나 같으니 true
반환
세번째 element의 6는 4보다 크거나 같으니 true
반환
네번째 element의 3는 4보다 작으니 false
반환 → 종료 → 출력 [4, 5, 6]
여기까지 prefix에 대해서 알아보았습니다.
이제 suffix의 2가지 종류에 대해서 알아봅시다.
: Array[]의 뒤에서부터 maxLength 길이를 가진 subsequence
print(arr.suffix(0)) // []
print(arr.suffix(-1)) // error
print(arr.suffix(3)) // [2, 3, 4]
print(arr.suffix(7)) // [1, 2, 3, 4]
suffix와 마찬가지로 maxLength의 인덱스 범위는 (0…) 입니다.
: Array[from…]의 subsequence
print(arr.suffix(from: -1)) // error
print(arr.suffix(from: 0)) // [1, 2, 3, 4]
print(arr.suffix(from: 3)) // [4]
print(arr.suffix(from: 4)) // []
print(arr.suffix(from: 5)) // error
자기 자신의 인덱스를 포함하여 배열의 끝까지 출력하는 것입니다.
prefix에 throught가 있다면, suffix에는 from이 있는 것이죠.
from도 인덱스를 기반으로 하기 때문에
from의 인덱스 범위는 (0…Array.count) 입니다.
prefix(upTo:)를 사용하는 것은 subsript notation을 사용하는 것과 동일합니다.
print(arr.prefix(upTo: 2)) // [1, 2]
print(arr[..<2]) // [1, 2]
prefix(through:)를 사용하는 것도 마찬가지 이겠죠?
print(arr.prefix(through: 2)) // [1, 2, 3]
print(arr[...2]) // [1, 2, 3]
suffix(from:)도 볼까요?
print(arr.suffix(from: 3)) // [4]
print(arr[3...]) // [4]
틀린 개념이나 부족한 부분이 있다면, 언제든지 댓글로 피드백해주세요~!
그럼 안녕히계세요✨
📝 이 게시글은 구글링을 통한 밑의 @Zedd0202님의 velog를 통한 학습 후 스스로 정리해 적은 포스팅입니다.
https://velog.io/@folw159/Swift-components%EC%99%80-split%EC%9D%98-%EC%B0%A8%EC%9D%B4#references
🍏 apple의 공식 문서
https://developer.apple.com/documentation/swift/array
https://developer.apple.com/documentation/swift/collection/subsequence#discussion