过滤搜索多个单词,iOS,Swift

问题描述 投票:0回答:3

我想在搜索栏中更好地过滤我的结果。

我有我的数组包含:

[["object": "Ball", "color": "Red"], ["object": "Ball", "color": "Blue"], ["object": "Square", "color": "Red"]]

当我搜索Ball所有的球出现时,但是当我添加红色(球红色)然后它也显示方块时,我希望它只显示一个包含Ball和Red两个单词的对象,而不是显示只包含其中一个的对象单词球或红色。可以这样做吗?

以下是我的代码。

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {


        let splitText = searchText.split(separator: " ")
        filteredVehicles = posts.filter {
            if let s = $0["object"] as? String, splitText.index(of: Substring(s)) != nil {
                return true
            }
            if let s = $0["color"] as? String, splitText.index(of: Substring(s)) != nil {
                return true
            }
            return false
        }
}
ios swift search filter
3个回答
1
投票

使用此功能,您还可以使用反向顺序进行搜索(“蓝色球” - >“球蓝色”)。

let splitText = searchText.split(separator: " ")
let filteredObjects = objects.filter {
    var include = false

    for text in splitText {
        if let s = $0["object"], text.contains(s) {
            include = true
            continue
        }

        if let s = $0["color"], text.contains(s) {
            include = true
            continue
        }

        return false
     }

     return include
}

0
投票

将您的代码更改为以下

let splitText = searchText.split(separator: " ")
filteredVehicles = posts.filter {

    if  splitText.count > 1 {
        return ($0["color"]?.contains(splitText[0]))! && ($0["object"]?.contains(splitText[1]))!
    } else if splitText.count == 1  {
       return ($0["object"]?.contains(splitText[0]))!
    }
    return false
}

0
投票

1.像这样更新过滤条件

let filter = dict.filter {

var isPassed = false

let split = searchText.components(separatedBy: .whitespaces)

if split.count > 1 {

    if ($0["object"]!.contains(split[0]) && $0["color"]!.contains(split[1])) || ($0["object"]!.contains(split[1]) && $0["color"]!.contains(split[0])) {
        isPassed = true
    }
} else {

    if $0["object"]!.contains(split[0]) || $0["color"]!.contains(split[0]) {
        isPassed = true
    }
}
return isPassed
}
© www.soinside.com 2019 - 2024. All rights reserved.