搜索UITableView并忽略标点符号

问题描述 投票:-2回答:2

有没有办法搜索UITableView并忽略某些字符,如逗号或点?

即我想搜索“St George”,但我的数据集包含“St. George”,因此结果始终为零。

编辑问:

 func filteredArray(searchText: NSString) {
    if searchText == "" {
        array_search = array_all
    } else {
        showTableViewResults()
        array_search.removeAll()
        for i in 0 ..< array_all.count {
            let object:MyObject = array_all[i]
            let languageSearchString = object.myObjectName
            let searchStr:String = languageSearchString!
            if searchStr.lowercased().contains(searchText.lowercased) {
                array_search.append(object)
            }
        }
    }
    tableView.reloadData()
    recordsFoundLabel.text = "records found: \(array_search.count)"
}
ios swift string uitableview uisearchcontroller
2个回答
1
投票

在执行搜索之前,您可以过滤掉字符串中没有字母的所有字符。这同样适用于表视图数据源元素。同样如rmaddy所述,您应该实现不区分大小写的搜索:

编辑/更新Swift 5或更高版本

extension StringProtocol where Self: RangeReplaceableCollection {
    func containsCaseInsensitive(_ string: String) -> Bool {
        return range(of: string, options: .caseInsensitive) != nil
    }
    var letters: Self {
        return filter{ $0.isLetter }
    }
}

测试:

let search = "st george"
let tableViewSource = ["Apple", "Orange", "Banana", "St. George"]

let filtered = tableViewSource.filter {
    $0.letters.containsCaseInsensitive(search.letters)
}
print(filtered)   // ["St. George"]


如果你想从字符串中删除标点符号(注意保留字符串中的空格),你可以这样做:

extension StringProtocol where Self: RangeReplaceableCollection {
    mutating func removePunctuation() {
        removeAll { !$0.isPunctuation }
    }
    var removingPunctuation: Self {
        return filter { !$0.isPunctuation }
    }
}

测试:

let filtered = tableViewSource.filter {
    $0.removingPunctuation.caseInsensitiveContains(search.removingPunctuation)
}
print(filtered)   // ["St. George"]

如果您想实现与Xcode自动完成相同的逻辑,则需要搜索每个字符并更改搜索到的字符串的startIndex:

extension StringProtocol where Self: RangeReplaceableCollection {
    func containsCaseInsensitiveCharactersInSequence(_ string: Self) -> Bool {
        var found = 0
        var start = startIndex
        string.forEach {
            while let range = self[start...].range(of: String($0), options: .caseInsensitive) {
                found += 1
                start = range.upperBound
                break
            }
        }
        return found == string.count
    }
}

游乐场测试:

let search = "stgrge"
let tableViewSource = ["Apple", "Orange", "Banana", "St. George"]

let filtered = tableViewSource.filter {

    $0.removingPunctuation.containsCaseInsensitiveCharactersInSequence(search.removingPunctuation)

}
print(filtered)   // ["St. George"]

0
投票

我认为你应该简单地实现一个函数,对于任何给定的字符串,将返回相同的字符串而没有任何点,(或者你想要擦除的任何东西);如 :

func erase(characters: [String], fromText text: String) -> String {
    var result = String()
    for character in text.characters {
         if !characters.contains(character) {
             result += String(character)
         }
    }
    return result
 }

(我不能从我的位置测试它,但你明白了吗?)

希望能帮助到你

© www.soinside.com 2019 - 2024. All rights reserved.