[SearchApp Devlog 05] 원하는 키워드 하이라이트 처리하기
Devlog 05
원하는 키워드 하이라이트
내가 검색한 키워드.. (b태그로 감싼거 말고 딱 내가 넣은 검색어만)를 하이라이트 처리를 하고 싶었다.
아무리 찾아봐도 SwiftUI에서는 AttributedString의 backgroundColor 값을 조정하라는데, 도대체 내가 생각한 키워드만은 어떻게 변경하는 것일까…
찾아보니 attributedString의 특정 range에 접근할 수가 있었다.
attributedString[특정 range].backgroundColor = .yellow
요렇게!!
그래서 그러면, 일단 내가 검색한 키워드가 문장에 있으면 거기 range를 다 뽑아내자고 생각했다.
문자열에서 원하는 키워드 range 뽑기
private extension AttributedString {
func ranges(of keyword: String) -> [Range<AttributedString.Index>] {
var string = self
let reversedKeyword = AttributedString(keyword.reversed())
var ranges: [Range<AttributedString.Index>] = []
while let range = string.range(of: keyword) {
ranges.append(range)
string.replaceSubrange(range, with: reversedKeyword)
}
return ranges
}
}
우선 ranges 메서드를 만들었다. 클래스에 만들지 않고 AttributedString으로 만들었다. 왜냐면 일반 String의 Rnage로는 attributedString에 접근이 되지 않아서 **[Range
코드를 살펴보면
- AttributedString에서 지원하는 range(of:)로 검색어의 range를 찾아준다.
- 찾은 range는 결과값 반환할 ranges에 추가하고 replaceSubrange로 찾은 키워드를 변경한다.
- 글자수가 똑같아야 range가 안변하니까 keyword를 reverse한 값을 사용했다.
- 글자를 변경한 이유는 range(of:)가 계속 처음 range 만을 찾기 때문..! 그냥 String이었다면 특정 range 사이에서 찾을 수 있는 메서드를 지원해주는데 AttributedString에서는 지원되지 않았다. 이런건 좀 같이 지원해줘 애플..
- range(of:)로 더이상 찾을 값이 없을 때 return한다.
마무리
처음에 구글의 바다에서 검색을 할 때는 String으로만 지원해주는 메서드를 많이 봤는데, AttributedString 코드는 하나도 없어서… String 코드를 사용할 수 있게 변경을 해보았다. Range
정리해보니 이런거는 Index 통일 좀 해주면 안되는것일까 싶긴 했다. 다음 글은 이제 웹뷰 연결하는 글이 되겠다!
Leave a comment