검색바에 좀더 다채로움을 주고싶어서.. 그게 뭐가 있을까 고민해보니..
초성검색 기능이 있으면 괜찮곘다 싶어졌습니다.
let hangeul = ["ㄱ","ㄲ","ㄴ","ㄷ","ㄸ","ㄹ","ㅁ","ㅂ","ㅃ","ㅅ","ㅆ","ㅇ","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"]
func chosungCheck(word: String) -> String {
var result = ""
for char in word {
let octal = char.unicodeScalars[char.unicodeScalars.startIndex].value
if 44032...55203 ~= octal {
let index = (octal - 0xac00) / 28 / 21
result = result + hangeul[Int(index)]
}
}
return result
}
func isChosung(word: String) -> Bool {
var isChosung = false
for char in word {
if 0 < hangeul.filter({ $0.contains(char)}).count {
isChosung = true
} else {
isChosung = false
break
}
}
return isChosung
}
그럼 이 코드를 서치바에서 어떻게 적용시킬까요?
var arr = ["zehye", "hi", "hello", "nice", "to", "meet", "you"]
var filterredArr: [String] = []
extension SearchViewController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
// 텍스트의 공백 제거
let text = searchText.trimmingCharacters(in: .whitespaces)
// 서치바에 적힌 공백이 제거된 글자의 초성을 체크
let isChosungCheck = isChosung(word: text)
// filterText라는 상수를 받아 arr를 필터링 합니다.
// 서치바에서 받은 text에 arr의 초성이 포함되어있는지 여부를 따집니다.
let filterText = arr.filter({
if isChosungCheck {
return ($0.contains(text) || chosungCheck(word: $0).contains(text))
} else {
return $0.contains(text)
}
})
// 포함되는 filterText를 filterredArr에 담아주고
self.filterredArr = filterText
// 테이블뷰 리로드를 합니다.
self.tableView.reloadData()
}
// 검색버튼을 눌렀을때도 마찬가지의 로직을 진행합니다.
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
guard let text = self.searchBar.text?.trimmingCharacters(in: .whitespaces) else { return }
let isChosungCheck = isChosung(word: text)
let filterText = list.filter({
if isChosungCheck {
return ($0.contains(text) || chosungCheck(word: $0).contains(text))
} else {
return $0.contains(text)
}
})
self.filterredArr = filterText
self.isFiltering = !(self.searchBar.text?.count == 0)
self.tableView.reloadData()
}
}