[Swift] Range<String.Index> 의 upperBound 에 대하여

원하는 키워드가 등장하는 첫번째 위치를 중심으로 문자열을 분리해보자

naljin
5 min readNov 13, 2022

들어가기 전에

개-하!

드디어 미디엄이 코드 하이라이팅을 지원하기 시작했군여? 드디어 말이 통하는… 그럼 이제 한글 입력할때 깨지는 것 좀 어떻게 해봐라..!

튼 오늘도 시작해봅시다 ㄱ ㄱ

님덜 님덜 이렇게 “서울특별시” 에서 “특별” 에 대한 firstRange 를 뽑은 다음

let originalText = "서울특별시"
let highlightText = "특별"
let range = originalText.firstRange(of: highlightText)!

lowerBoundupperBoundString.Index 에 접근하면 각각 어디 위치에 해당할거 같으세여?

range.lowerBound
range.upperBound

전 이렇게 될 줄 알았거든여?

그래서 아래 코드를 실행하면

originalText.prefix(through: range.lowerBound)
originalText.prefix(through: range.upperBound)

각각 “서울특” 과 “서울특별” 이 나올줄 알았음요

하지만 현실은

??? upperBound 가 “시” 까지 잡힌다고??

실제로 인덱스 값을 Int 로 프린트해봐도 lowerBound 는 "특" 에 해당하는 2 로 나오고, upperBound 는 "시" 에 해당하는 4 로 나옴여

let originalText = "서울특별시"
let highlightText = "특별"
let range = originalText.firstRange(of: highlightText)!
let startIndex = originalText.distance(from: originalText.startIndex,
to: range.lowerBound)
let endIndex = originalText.distance(from: originalText.startIndex,
to: range.upperBound)
print(startIndex, endIndex) // 2 4

Range

어떻게 된 일인지.. 알아보기 위해! 우선 firstRangeRange 를 반환하기 때문에

Range 의 정의부터 살펴봤슴니다

흠.. lowerBound 부터 upperBound 까지 범위를 나타내는데, 이때 upperBound 는 포함하지 않는다고 하네여????

그러니까 범위를 식으로 표현하면 이렇게 된단 말이져??

lowerBound..<upperBound

즉 “특별” 에 대한 range 를 표현하려면 2..<4 가 되어야하기 때문에 lowerBound2, upperBound4 가 되는거군여

마무리

이렇게 이해한 RangeupperBoundlowerBound 에 대한 내용을 바탕으로 Stringprefixsuffix 메소드를 잘 조져주면?

let originalText = "서울특별시"
let highlightText = "특별"
let range = originalText.firstRange(of: highlightText)!
let highlightTextPrefix = String(originalText.prefix(upTo: range.lowerBound))
let highlightTextSuffix = String(originalText.suffix(from: range.upperBound))
print(highlightTextPrefix) //서울
print(highlightText) //특별
print(highlightTextSuffix) //시

원하는 키워드가 등장하는 첫번째 위치를 중심으로 앞뒤로 문자열을 나눌 수 있습니다

끗!

참고

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

--

--

No responses yet