在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]; } 

任何人都可以build议如何在Swift中创buildNSPredicate的等价物?

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

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

在Swift中,构造函数会跳过“blahWith …”部分,只是将类名称作为函数,然后直接进入参数,所以[NSPredicate predicateWithFormat: …]将成为NSPredicate(format: …) 。 (又如, [NSArray arrayWithObject: …]将成为NSArray(object: …) ,这是Swift中的一个常规模式。

所以现在我们只需要将parameter passing给构造函数。 在Objective-C中,NSString文字看起来像@"" ,但在Swift中,我们只是用string引号。 所以这给了我们:

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

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

(顺便说一下,你会注意到一些其他的答案,而不是使用格式string,如"name contains[c] \(searchText)" 。这是不正确的。这使用string插值,这是不同的谓词格式,通常不会为此工作。)

使用谓词相当长的时间。 这是我的结论(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]) 

示例如何在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) } 

你会得到(操场)

在这里输入图像说明

使用下面的代码:

  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) } 

我认为这将是一个更好的方式在Swift中做到这一点:

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

在迅速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) }