在Swift中使用谓词

lev*_*jay 90 predicate objective-c ios ios7 swift

我正在为我的第一个应用程序(学习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];
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议如何在Swift中为NSPredicate创建一个等价物?

Chu*_*uck 148

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

[NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
Run Code Online (Sandbox Code Playgroud)

在Swift中,构造函数跳过"blahWith ..."部分,只使用类名作为函数,然后直接进入参数,所以[NSPredicate predicateWithFormat: …]会变成NSPredicate(format: …).(另一个例子,[NSArray arrayWithObject: …]将成为NSArray(object: …).这是Swift中的常规模式.)

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

let resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)
Run Code Online (Sandbox Code Playgroud)

事实上,这正是我们在这里所需要的.

(顺便提一下,你会注意到其他一些答案,而是使用类似的格式字符串"name contains[c] \(searchText)".这是不正确的.它使用字符串插值,这与谓词格式不同,通常不适用于此.)

  • 要解决方法的第二行,可以将谓词用作:`searchResults = recipes.filter {resultPredicate.evaluateWithObject($ 0)}` (2认同)

Jiř*_*lka 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])
Run Code Online (Sandbox Code Playgroud)


gbk*_*gbk 26

示例如何在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) }
Run Code Online (Sandbox Code Playgroud)

你会得到(游乐场)

在此输入图像描述


Gur*_*pad 9

您可以使用swift中提供的过滤器来过滤数组中的内容,而不是使用Objective-C中的谓词.

Swift 4.0中的一个例子如下:

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

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

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


PRE*_*MAR 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)
}
Run Code Online (Sandbox Code Playgroud)


Har*_*ris 5

我认为这是在Swift中更好的方法:

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