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

6

我是一个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中也可以使用相同的谓词(predicate)。但是我正在寻找等效的Swift代码,以便我可以学习如何使用map和filter。非常感谢任何帮助。

4个回答

16

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

let searchText = "MITH"

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

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

Swift 3:


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

1
你可以通过先定义一个过滤函数来进行过滤,也可以将过滤器包含在闭包中。以下是一个摘录,您可以将其粘贴到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({$0["firstName"] == "Johnny"})

r

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

s

您可以使用过滤器对搜索结果进行筛选,例如按名字和姓氏筛选。
var result = (nameList.filter({$0["lastName"] == "Smith"})).filter({$0["firstName"] == "Johnny"})

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


0
请尝试以下方法。
我已经传递了一个“常量值”,您需要在“someString变量”的位置传递您的“动态值”。
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)

我已经说过我知道如何在Swift中使用NSPredicate。我正在寻找Swift的过滤器。 - Nassif

0

试一下,

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 {
        $0["firstName"] == searchText
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接