다음 예제는 모두
var str = "Hello, playground"
스위프트 4
문자열은 Swift 4에서 상당히 큰 점검을 받았습니다. 이제 문자열에서 하위 문자열을 가져 오면 Substring
대신 유형이 반환 String
됩니다. 왜 이런거야? 문자열은 Swift의 값 유형입니다. 즉, 하나의 문자열을 사용하여 새 문자열을 만들면 복사해야합니다. 이것은 안정성에는 좋지만 (다른 사람은 모르게 변경하지 않을 것임) 효율성에는 좋지 않습니다.
반면에 하위 문자열은 원래 문자열에 대한 참조입니다. 다음은이를 설명하는 문서 의 이미지 입니다.
복사가 필요하지 않으므로 사용하기가 훨씬 효율적입니다. 그러나 백만 개의 문자열에서 10 개의 문자 하위 문자열이 있다고 가정하십시오. 하위 문자열이 문자열을 참조하므로 시스템은 하위 문자열이있는 한 전체 문자열을 유지해야합니다. 따라서 부분 문자열을 다룰 때마다 문자열로 변환하십시오.
let myString = String(mySubstring)
이것은 부분 문자열만을 복사하고 오래된 문자열을 보유한 메모리를 회수 할 수 있습니다 . 하위 문자열 (유형)은 수명이 짧아야합니다.
Swift 4의 또 다른 큰 개선점은 Strings is Collections (다시)입니다. 즉, Collection에 대해 할 수있는 모든 작업을 String에 수행 할 수 있습니다 (아래 첨자 사용, 문자 반복, 필터 등).
다음 예제는 Swift에서 하위 문자열을 얻는 방법을 보여줍니다.
부분 문자열 얻기
첨자 나 여러 가지 다른 방법 (예 prefix
: suffix
, split
) 을 사용하여 문자열에서 부분 문자열을 가져올 수 있습니다 . 그래도 범위에 String.Index
대한 Int
색인이 아닌 사용해야 합니다. ( 나의 다른 대답을보십시오 도움이 필요하면 .)
문자열의 시작
아래 첨자를 사용할 수 있습니다 (Swift 4 단면 범위 참고).
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str[..<index] // Hello
또는 prefix
:
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str.prefix(upTo: index) // Hello
또는 더 쉬운 :
let mySubstring = str.prefix(5) // Hello
문자열의 끝
아래 첨자 사용 :
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str[index...] // playground
또는 suffix
:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str.suffix(from: index) // playground
또는 더 쉬운 :
let mySubstring = str.suffix(10) // playground
를 사용할 때 나는를 사용 suffix(from: index)
하여 끝에서 다시 카운트해야 한다는 것을 유의하십시오 -10
. String suffix(x)
의 마지막 x
문자를 취하는을 사용할 때 필요하지 않습니다 .
문자열의 범위
다시 우리는 단순히 아래 첨자를 사용합니다.
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
let mySubstring = str[range] // play
변환 Substring
에String
하위 문자열을 저장할 준비 String
가되면 이전 문자열의 메모리를 정리할 수 있도록 하위 문자열을 변환해야 합니다.
let myString = String(mySubstring)
사용하여 Int
인덱스 확장을?
Airspeed Velocity와 Ole Begemann의 Swift 3의 StringsInt
기사를 읽은 후 기본 색인 확장 을 사용하는 것이 주저합니다 . Swift 4에서는 Strings가 컬렉션이지만 Swift 팀은 의도적으로 인덱스를 사용하지 않았습니다 . 아직 입니다. 이것은 다양한 수의 유니 코드 코드 포인트로 구성된 스위프트 문자와 관련이 있습니다. 실제 인덱스는 모든 문자열에 대해 고유하게 계산되어야합니다.Int
String.Index
나는 스위프트 팀이 String.Index
미래 에 추상화 할 수있는 방법을 찾길 바란다 . 그러나 그들까지 API를 사용하기로 결정했습니다. 문자열 조작은 단순한 Int
인덱스 조회 가 아니라는 것을 기억하는 데 도움이됩니다 .