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)".这是不正确的.它使用字符串插值,这与谓词格式不同,通常不适用于此.)
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)
你会得到(游乐场)
您可以使用swift中提供的过滤器来过滤数组中的内容,而不是使用Objective-C中的谓词.
Swift 4.0中的一个例子如下:
var stringArray = ["foundation","coredata","coregraphics"]
stringArray = stringArray.filter { $0.contains("core") }
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,由于数组中的每个元素都是一个字符串,因此您可以使用该contains方法过滤数组.
如果数组包含自定义对象,则可以使用该对象的属性来类似地过滤元素.
使用下面的代码:
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)
我认为这是在Swift中更好的方法:
func filterContentForSearchText(searchText:NSString, scope:NSString)
{
searchResults = recipes.filter { name.rangeOfString(searchText) != nil }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
120080 次 |
| 最近记录: |