pop & drop
Swift 문자열 또는 배열은 popFirst(), dropFirst(__:) 메소드와 popLast(), dropLast(__:) 메소드를 제공합니다.
First와 Last는 각각 '앞에서부터' 또는 '뒤에서부터'라고 생각하면 이해하기 쉽습니다.
원본 배열의 '앞에서부터' 또는 '뒤에서부터' 요소를 1개 삭제한 다음, 삭제한 요소를 옵셔널 형태로 리턴해줍니다.
var numbers = [1,2,3] // 원본이 바뀌기 때문에 var 키워드로 선언
numbers.popLast() // returns: 3 '뒤에서부터' 요소를 1개 삭제, 삭제한 요소를 옵셔널 형태로 리턴
numbers // [1, 2] 원본 배열에서 마지막 요소 삭제
원본배열엔 아무런 영향을 주지 못합니다.
원본배열과 똑같은 값을 복사한다음, '앞에서부터' 또는 '뒤에서부터' 전달한 파라미터의 '갯수'만큼 요소를 삭제해 주고, 삭제한 요소를 제외한 새로운 배열 또는 문자열을 리턴해줍니다. 여기서 리턴 타입은 subsequence 입니다.
let numbers = [1,2,3] // 원본에 아무런 영향을 주지 않기 때문에 let 키워드로 선언해도 문제가 없음
numbers.dropLast(2) // returns: [1] 뒤에서부터 2개를 지우고 새로운 subsequence 타입의 배열을 리턴
numbers // 원본엔 아무런 영향을 주지 않음
popFirst()
Swift는 분명 popFirst()를 제공하는데, 이상하게 배열이나 문자열 인스턴스에서 호출을 하려고 하면 자동완성이 뜨지 않거나 에러가 발생합니다.
정확한 사용법을 알기 위해 Apple Reference를 참고했습니다.
popFirst() 링크
mutating func popFirst() -> Self.Element?
글을 읽어보면, 메소드를 호출하는 인스턴스의 타입이 SubSequence인 경우에만 사용이 가능하다고 나와있습니다.
배열 또는 문자열 타입을 SubSequence로 바꿔주면, 사용이 가능합니다.
var str = "Hello, Swift?"
var sub = str[str.startIndex...] // "Hello, Swift?"
sub.popFirst() // "H" 삭제
sub // "ello, Swift?"
코드가 문제없이 실행됩니다.
SubSequence로 바꾼 문자열을 다시 String으로 사용하고 싶다면, 생성자를 사용해 값을 전달해주면 됩니다.
String(sub)
배열을 SubSequence 타입으로 바꾸기
SubSequence 타입이나 indices 속성을 사용해 ArraySlice 타입으로 변경해주면 됩니다.
var numsUntil6 = [1,2,3,4,5,6]
var sub = numsUntil6[numsUntil6.startIndex...]
// var sub: Array<Int>.SubSequence
sub.popFirst()
sub
var numsUntil5 = [1,2,3,4,5]
var slice = numsUntil5[numsUntil5.indices]
// var slice: ArraySlice<Int>
slice.popFirst()
slice