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