적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[Swift iOS] 검색기능구현 - 문자열 탐색 NSString.CompareOptions

hongssup_ 2021. 6. 22. 14:04
반응형

Foundation > NSString 문서를 살펴보면 다음과 같은 문자열 비교/탐색 옵션들이 있다.

이들을 활용하면 문자열을 더욱 간편하게 판별하고 사용할 수 있다. 

import CoreFoundation

extension NSString {    
    public struct CompareOptions : OptionSet {        
        public static var caseInsensitive: NSString.CompareOptions { get }
        public static var literal: NSString.CompareOptions { get }
        public static var backwards: NSString.CompareOptions { get }
        public static var anchored: NSString.CompareOptions { get }
        public static var numeric: NSString.CompareOptions { get }
        public static var diacriticInsensitive: NSString.CompareOptions { get }
        public static var widthInsensitive: NSString.CompareOptions { get }
        public static var forcedOrdering: NSString.CompareOptions { get }
        public static var regularExpression: NSString.CompareOptions { get }
    }
}

.caseInsensitive

case-sensitive는 대소문자를 구분하여 취급하는 것으로 caseInsensitive는 대소문자를 구분하지 않고 찾아주는 옵션이다. 

extension String {
    func compareWord(find: String) -> Bool {
        return self.range(of: find, options: .caseInsensitive) != nil
    }
}

이런식으로 String의 extension으로 선언을 해주고 다음과 같이 활용할 수 있다. 

func searchWord(text: String) {
    let searchedWordArray = wordsArrayCopy.filter { word -> Bool in
        word.name.compareWord(find: text)
    }
    wordsArray = searchedWordArray
    tableView.reloadData()
}

탐색 시 대소문자 상관 없이 검색 문자열과 일치하는 문자열이 있을 경우 배열에 집어넣어 테이블뷰를  reload해준다.

이렇게 하면 '다' 를 검색했을 때, [검색하다, 다람쥐, 다리미, 지우다] 등의 순서로 '다'를 포함한 모든 단어를 반환해준다. 

 

.anchored

: Search is limited to start (or end, if NSBackwardsSearch) of source string.

소스 문자열의 시작 부분으로만 탐색이 제한된다. 

'다'를 검색 했을 때, [다람쥐, 다리미] 등 다로 시작하는 단어들만 반환해준다. 

다음과 같이 option을 여러개 사용해서 탐색할 수도 있다. 

extension String {
    func compareWord(find: String) -> Bool {
        return self.range(of: find, options: [.caseInsensitive, .anchored]) != nil
    }
}

 

 

 

 

 

 

 

참고 : zedd_CompareOptions 종류

728x90
반응형