님덜 님덜 이렇게 “서울특별시” 에서 “특별” 에 대한 firstRange
를 뽑은 다음
let originalText = "서울특별시"
let highlightText = "특별"
let range = originalText.firstRange(of: highlightText)!
lowerBound
와 upperBound
로 String.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
어떻게 된 일인지.. 알아보기 위해! 우선 firstRange
는 Range
를 반환하기 때문에
요 Range
의 정의부터 살펴봤슴니다
흠.. lowerBound
부터 upperBound
까지 범위를 나타내는데, 이때 upperBound
는 포함하지 않는다고 하네여????
그러니까 범위를 식으로 표현하면 이렇게 된단 말이져??
lowerBound..<upperBound
즉 “특별” 에 대한 range 를 표현하려면 2..<4
가 되어야하기 때문에 lowerBound
는 2
, upperBound
는 4
가 되는거군여
마무리
이렇게 이해한 Range
의 upperBound
와 lowerBound
에 대한 내용을 바탕으로 String
의 prefix
와 suffix
메소드를 잘 조져주면?
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) //시
원하는 키워드가 등장하는 첫번째 위치를 중심으로 앞뒤로 문자열을 나눌 수 있습니다
끗!