swift & iOS/swift

[swift] 문자열 끝에서 자르기 dropLast()

whale3 2022. 1. 23. 23:11

출처: https://developer.apple.com/documentation/swift/string/2893517-droplast

 

Apple Developer Documentation

 

developer.apple.com

 

문자열을 끝내서 잘라낸 후 남은 문자열만 취하고 싶으면 dropLast(:) 메소드를 사용하면 된다. 

let x = "10%"
print(x.dropLast()) // "10"
print(x.dropLast(1)) // "10" 위와 같음

print(x.dropLast(0)) // "10%" 끝에서 아무것도 잘라내지 않음

다만 잘라낸 후 반환하는 문자열의 타입은 String이 아닌 Substring이기 때문에 String이 필요하다면 타입을 바꿔줘야 한다.

print(type(of: x.dropLast())) // Substring

let str = String(x.dropLast())

 

String에 사용하던 대로 대문자로 만든다던지 특정 문자를 찾는다던지(firstIndex(of:)) 하는 것들을 substring 타입에도 할 수 있지만 substring 가지고 뭘 조작을 하거나 그럴 것 아니면 substring을 변수에 할당해 놓지 말라고 하는 것 같다. substring은 잘라내기 이전의 원본 String에 대한 참조를 계속 갖고 있기 때문에 (심지어 원본 String에 대한 참조가 없어져도) 메모리 누수의 원인이 될 수 있다고 나와있었다. (존재하지 않는 문자열 데이터에 대한 흔적을 substring이 계속 갖고 있기 때문) 

해석을 잘못 했을 수도 있는데 포인트는 문자열을 조작할 때 외에는 substring을 쓸데없이 갖고 있지 말라는 것 같다.

출처: https://developer.apple.com/documentation/swift/substring
Important
Don’t store substrings longer than you need them to perform a specific operation. A substring holds a reference to the entire storage of the string it comes from, not just to the portion it presents, even when there is no other reference to the original string. Storing substrings may, therefore, prolong the lifetime of string data that is no longer otherwise accessible, which can appear to be memory leakage.

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

 

Apple Developer Documentation

 

developer.apple.com

 

아 그리고 dropLast는 배열에도 사용할 수 있다. 

let a = [1, 2, 3, 4, 5]
 
print(a.dropLast()) // [1, 2, 3, 4]
print(a.dropLast()[0]) // 1
print(a.dropLast().count) // 4
print(type(of: a.dropLast())) // ArraySlice<Int>

 

 

시간 복잡도는 아래와 같이 나와있다. 배열같은 RandomAccessCollection 프로토콜을 채택하는 것 일때는 O(1), 그 외에는 지우려는 요소에 개수가 많아질 수록 시간이 늘어난다. O(n)

 

Complexity: O(1) if the collection conforms to RandomAccessCollection; otherwise, O(k), where k is the number of elements to drop.

 

반응형