使用 Swift 根据搜索文本搜索数组

Search an array based on search text using Swift

我是 swift 的新手,我有一个新项目。我正在尝试做一个搜索功能。我有一个字典数组,包含 firstName 和 lastName 作为键,我需要根据包含搜索字符串

的 firstName 过滤掉人
let nameList : [Dictionary<String,String>] = 
[["firstName" : "John Sam","lastName" : "Smith"],
["firstName" : "Johnny","lastName" : "Smith"],
["firstName" : "Albert","lastName" : "Smith"],
["firstName" : "Alby","lastName" : "Wright"],
["firstName" : "Smith","lastName" : "Green"]]

与 objective C 一样,我可以轻松地使用

[NSPredicate predicatewithformat:"firstName contains[c] %@",searchText] 

我也知道可以在 Swift 上完成相同的谓词。但我正在寻找等效的 Swift,以便我可以了解如何使用映射和过滤器。任何帮助表示赞赏

请尝试以下方式。

我已经通过了 constant value 你需要在 someString variable 的地方通过你的 dynamic value

let someString = "Alby"
        var arr:NSArray =
            [["firstName" : "John Sam","lastName" : "Smith"],
            ["firstName" : "Johnny","lastName" : "Smith"],
            ["firstName" : "Albert","lastName" : "Smith"],
            ["firstName" : "Alby","lastName" : "Wright"],
            ["firstName" : "Smith","lastName" : "Green"]]


        var pre:NSPredicate = NSPredicate(format: "firstName CONTAINS[c] %@", someString)!
        var result:NSArray = arr.filteredArrayUsingPredicate(pre)

        print(result)

试试,

let searchText = "John Sam"

func isMatch (nameDictionary: Dictionary<String, String>) -> Bool {
    if(nameDictionary["firstName"] == searchText) {
        return true
    }
    else {
        return false
    }

}

let results = nameList.filter(isMatch)

您可以自由使用闭包。

let searchText = "John Sam"

let results = nameList.filter {
    nameDictionary in
    nameDictionary["firstName"] == searchText
}

或者,

let searchText = "John Sam"
    let results = nameList.filter {
        [=12=]["firstName"] == searchText
    }

可以使用 rangeOfString().CaseInsensitiveSearch 选项实现与谓词运算符 "CONTAINS[c]" 对应的搜索:

let searchText = "MITH"

let filtered = nameList.filter {
    return [=10=]["firstName"]?.rangeOfString(searchText, options: .CaseInsensitiveSearch) != nil
}

// Result: [[firstName: Smith, lastName: Green]]

Swift 3:

let filtered = nameList.filter {
    return [=11=]["firstName"]?.range(of: searchText, options: .caseInsensitive) != nil
}

您可以先定义一个过滤依据的函数来进行过滤,或者只将过滤器包含在闭包中。以下是您可以粘贴到 playground 中的摘录,它演示了这两个选项:

let nameList : [Dictionary<String,String>] =
[["firstName" : "John Sam","lastName" : "Smith"],
    ["firstName" : "Johnny","lastName" : "Smith"],
    ["firstName" : "Albert","lastName" : "Smith"],
    ["firstName" : "Alby","lastName" : "Wright"],
    ["firstName" : "Smith","lastName" : "Green"]]

func fn (x: Dictionary<String,String>) -> Bool {
    return x["firstName"] == "Johnny"
}

nameList.filter(fn)

var r = nameList.filter({[=10=]["firstName"] == "Johnny"})

r

var s = nameList.filter({[=10=]["lastName"] == "Smith"})

s

您还可以过滤筛选器的结果以搜索名字和姓氏,例如

var result = (nameList.filter({[=11=]["lastName"] == "Smith"})).filter({[=11=]["firstName"] == "Johnny"})

另请参阅:http://locomoviles.com/ios-tutorials/filtering-swift-array-dictionaries-object-property/