본문 바로가기

iOS/Swift

Instance Method / prefix(_:), suffix(_:)

# 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