在Swift中使用谓词


93

我正在为我的第一个应用程序浏览本教程(学习Swift):http : //www.appcoda.com/search-bar-tutorial-ios7/

我被困在这部分(Objective-C代码):

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c]         %@", searchText];
    searchResults = [recipes filteredArrayUsingPredicate:resultPredicate];
}

谁能建议如何在Swift中为NSPredicate创建等效项?

Answers:


158

这实际上只是语法切换。好,所以我们有这个方法调用:

[NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];

在Swift中,构造函数跳过“ blahWith…”部分,仅将类名用作函数,然后直接进入参数,因此[NSPredicate predicateWithFormat: …]将变为NSPredicate(format: …)。(例如,[NSArray arrayWithObject: …]将变为NSArray(object: …)。这是Swift中的常规模式。)

所以现在我们只需要将参数传递给构造函数即可。在Objective-C中,NSString文字看起来像@"",但是在Swift中,我们仅对字符串使用引号。这样就给我们:

let resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)

实际上,这正是我们这里需要的。

(顺便说一句,您会注意到其他一些答案,而不是使用格式字符串,例如"name contains[c] \(searchText)"。这是不正确的。它使用字符串插值,这与谓词格式不同,通常对此不起作用。)


谢谢。你救了我一天!
雨果

2
要解决方法的第二行,可以使用以下谓词:searchResults = recipes.filter { resultPredicate.evaluateWithObject($0) }
Ben Packard

43

与谓词一起工作很长时间。这是我的结论(SWIFT)

//Customizable! (for me was just important if at least one)
request.fetchLimit = 1


//IF IS EQUAL

//1 OBJECT
request.predicate = NSPredicate(format: "name = %@", txtFieldName.text)

//ARRAY
request.predicate = NSPredicate(format: "name = %@ AND nickName = %@", argumentArray: [name, nickname])


// IF CONTAINS

//1 OBJECT
request.predicate = NSPredicate(format: "name contains[c] %@", txtFieldName.text)

//ARRAY
request.predicate = NSPredicate(format: "name contains[c] %@ AND nickName contains[c] %@", argumentArray: [name, nickname])

1
等于什么LIKE 'a%z'
TomSawyer

@JiříZahálka请求听到的是什么意思?
Muju

28

示例如何在Swift 2.0中使用

let dataSource = [
    "Domain CheckService",
    "IMEI check",
    "Compliant about service provider",
    "Compliant about TRA",
    "Enquires",
    "Suggestion",
    "SMS Spam",
    "Poor Coverage",
    "Help Salim"
]
let searchString = "Enq"
let predicate = NSPredicate(format: "SELF contains %@", searchString)
let searchDataSource = dataSource.filter { predicate.evaluateWithObject($0) }

你会得到(操场)

在此处输入图片说明


如果...如果我有一系列字典怎么办?如何解析以获取数据?
Revathy Durairajan

1
@RevathyDurairajan您需要SELF.yourkeyname来过滤字典数组。
Pawan Rai

11

您可以使用迅速可用的过滤器来过滤数组中的内容,而不是像在Objective-C中那样使用谓词。

Swift 4.0中的示例如下:

var stringArray = ["foundation","coredata","coregraphics"]
stringArray = stringArray.filter { $0.contains("core") }

在上面的示例中,由于数组中的每个元素都是一个字符串,因此可以使用该contains方法来过滤数组。

如果数组包含自定义对象,则可以使用该对象的属性类似地过滤元素。


6

使用以下代码:

 func filterContentForSearchText(searchText:NSString, scopes scope:NSString)
{
    //var searchText = ""

    var resultPredicate : NSPredicate = NSPredicate(format: "name contains[c]\(searchText)", nil)

    //var recipes : NSArray = NSArray()

    var searchResults = recipes.filteredArrayUsingPredicate(resultPredicate)
}

1
由于某种原因,这样写对我不起作用,但是让myPredicateString =“ name contains [c](searchText)”然后执行var resultPredicate:NSPredicate = NSPredicate(format:myPredicateString)确实
AppHandwerker

5

我认为这是在Swift中执行此操作的更好方法:

func filterContentForSearchText(searchText:NSString, scope:NSString)
{
   searchResults = recipes.filter { name.rangeOfString(searchText) != nil  }
}

1
如果您要过滤a Sequence,这会更惯用,但是在某些情况下NSPredicate,例如处理时,您将需要a NSFetchedResultsController
Jarsen

1

快速2.2

func filterContentForSearchText(searchText: String, scope: String) {
    var resultPredicate = NSPredicate(format: "name contains[c]         %@", searchText)
    searchResults = (recipes as NSArray).filteredArrayUsingPredicate(resultPredicate)
}

在迅速3.0

func filterContent(forSearchText searchText: String, scope: String) {
        var resultPredicate = NSPredicate(format: "name contains[c]         %@", searchText)
        searchResults = recipes.filtered(using: resultPredicate)
    }

1

//根据您的数组数据更改“名称”和“值”。

//更改您的数组(NSArray)的名称“ yourDataArrayName”。

    let resultPredicate = NSPredicate(format: "SELF.name contains[c] %@", "value")

    if let sortedDta = yourDataArrayName.filtered(using: resultPredicate) as? NSArray {

 //enter code here.

        print(sortedDta)
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.