# Array의 인스턴스 메소드 prefix / suffix 사용하기!!!
저는 그냥 간단하게 기능만 작성해보려고 했는데... 매개변수에 따라서 종류가 생각보다 많더라구요...?
그래서 그냥 하는김에 와장창 다 정리해보려고 합니다!!
# prefix / suffix의 반환 타입
prefix와 suffix는 Array의 인스턴스 메서드입니다.
따라서 반환되는 값의 타입을 Array라고 생각하실 수 있는데 사실 ArraySlice<Element>라는 타입을 반환합니다.
let arr: [Int] = [1, 2, 3]
print(type(of: arr))
print(arr)
//Array<Int>
//[1, 2, 3]
print(type(of: arr.prefix(1)))
print(arr.prefix(1))
print(type(of: Array(arr.prefix(1))))
print(Array(arr.prefix(1)))
//ArraySlice<Int>
//[1]
//Array<Int>
//[1]
다음과 같이 [Int]에 prefix를 하여도 리턴 타입을 확인해보면 ArraySlice<Int>가 나오는 것을 확인할 수 있습니다!!
사용하실 때 [Int] 타입의 값이 필요하다면 Array로 한번 형변환을 한 후 사용하셔야 합니다.
# prefix
prefix는 다음과 같이 4가지의 형태로 존재합니다.
func prefix(Int) -> Self.SubSequence
func prefix(through: Self.Index) -> Self.SubSequence
func prefix(upTo: Self.Index) -> Self.SubSequence
func prefix(while: (Self.Element) throws -> Bool) rethrows -> Self.SubSequence
하나씩 살펴 보겠습니다.
prefix(_:)
Collection에서 지정한 maxLength까지 하위 시퀀스를 반환합니다.
func prefix(_ maxLength: Int) -> Self.SubSequence
파라미터로 maxLength를 갖고 있습니다.
maxLength는 반환할 요소의 최대값을 의미합니다. 또한 maxLength는 0보다 크거나 같아야 합니다.
maxLength의 값이 요소의 최대값보다 크면 모든 값을 반환합니당.
let numbers = [1, 2, 3, 4, 5]
print(numbers.prefix(2))
// Prints "[1, 2]"
print(numbers.prefix(10))
// Prints "[1, 2, 3, 4, 5]"
prefix(through:)
Collection의 처음부터 지정한 위치까지의 하위 시퀀스를 반환합니다.
func prefix(through position: Self.Index) -> Self.SubSequence
파라미터로 position을 갖고 있습니다.
반환할 요소 중 마지막 인덱스를 의미합니다.
또한 index를 이용해서 접근하기 때문에 valid한 값을 넣어줘야 합니다.
let numbers = [10, 20, 30, 40, 50, 60]
if let i = numbers.firstIndex(of: 40) {
print(numbers.prefix(through: i))
}
// Prints "[10, 20, 30, 40]"
여기서 firstIndex(of:)는 배열의 앞부터 조회해 첫번째 일치하는 값의 index를 반환하는 메서드입니다.
따라서 i = 3 이 되며, index 0부터 3까지 총 4개의 값을 반환하였습니다.
prefix(upTo:)
Collection의 처음부터 지정한 위치(포함 X)까지의 하위 시퀀스를 반환합니다.
func prefix(upTo end: Self.Index) -> Self.SubSequence
바로 예시를 보면서 설명하겠습니다.
let numbers = [10, 20, 30, 40, 50, 60]
if let i = numbers.firstIndex(of: 40) {
print(numbers.prefix(upTo: i))
}
// Prints "[10, 20, 30]"
간단하게 index로 생각하시면 될 것 같습니다.
index 0 부터 3번 까지 출력을 하는데 지정한 위치인 3은 포함을 하지 않으므로 2까지 출력을 합니다.
따라서 [10, 20, 30]이 출력됩니다!!!
print(numbers.prefix(upTo: numbers.startIndex))
// Prints "[]"
이 예를 보시면 파라미터의 값이 startIndex로 0이 들어가게 됩니다.
따라서 index 0부터 0까지인데 지정 위치인 0은 포함안하므로 빈 배열이 나옵니당.
단, 주의할 점은 index이므로 값이 vaild해야 합니다!!
근데 다음과 같은 사용을 더 선호한다고 합니다.,..?
if let i = numbers.firstIndex(of: 40) {
print(numbers[..<i])
}
// Prints "[10, 20, 30]"
prefix(while:)
predicate의 조건이 false를 반환할때까지의 값의 하위 시퀀스를 반환합니다.
func prefix(while predicate: (Self.Element) throws -> Bool) rethrows -> Self.SubSequence
클로저의 리턴이 Bool인 것을 알 수있는데
만약 true라면 계속 실행하고, false라면 다시 호출하지 않습니다.
let numbers = [3, 5, 2, 5, 4]
print(numbers.prefix(while: { $0 >= 3 }))
$0은 3 이므로 index 2번째 값 까지는 true입니다.
하지만 3번째에서 2를 만나면서 false를 리턴하여 종료합니다.
결과로 [3, 5]를 출력하게 되겠습니다!
# suffix
prefix는 다음과 같이 4가지의 형태로 존재합니다.
func suffix(Int) -> Slice<ArchiveHeader>
func suffix(from: Int) -> Slice<ArchiveHeader>
suffix(_:)
prefix(_:)와 동일하므로 예시만 보여드리겠습니다.
let numbers = [1, 2, 3, 4, 5]
print(numbers.suffix(2))
// Prints "[4, 5]"
print(numbers.suffix(10))
// Prints "[1, 2, 3, 4, 5]"
suffix(from:)
index 기반으로하여 해당 위치부터 Collection의 마지막까지의 하위 시퀀스를 반환합니다.
func suffix(from start: Int) -> Slice<ArchiveHeader>
prefix(through:)와 동일한 방식으로 동작한다고 생각하시면 됩니다.
let numbers = [10, 20, 30, 40, 50, 60]
if let i = numbers.firstIndex(of: 40) {
print(numbers.suffix(from: i))
}
// Prints "[40, 50, 60]"
https://zeddios.tistory.com/1321
Swift ) prefix / suffix
안녕하세요 :) Zedd입니다. Array의 인스턴스 메소드로 prefix / suffix가 있잖아요!? 다같은 prefix / suffix가 아니고..파라미터에 따라 조금씩 다른데, 그냥 썼다가 아주 큰일날뻔 했어서 ㅎㅎ.. 한번 쫙
zeddios.tistory.com
'iOS > Swift' 카테고리의 다른 글
Metatype(.self, .Type, .Protocol) (1) | 2023.11.08 |
---|---|
Swift Xcode 프로젝트명 바꾸기 (0) | 2023.08.01 |
Swift Generic이란?? (0) | 2023.07.13 |
Initializer / init(repeating:count:) (0) | 2023.06.06 |
Function / print(_:separator:terminator:) (0) | 2023.06.06 |