我正在为我的第一个应用程序完成本教程(学习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创建一个等价物吗?
答案 0 :(得分:141)
这实际上只是一种语法切换。好的,所以我们有这个方法调用:
[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)"
这样的格式字符串。这是不正确的。这使用字符串插值,这与谓词格式不同,通常不起作用为此。)
答案 1 :(得分:40)
长时间使用谓词。这是我的结论(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])
答案 2 :(得分:21)
示例如何在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) }
你会得到(游乐场)
答案 3 :(得分:10)
您可以使用swift中提供的过滤器来过滤数组中的内容,而不是使用Objective-C中的谓词。
Swift 4.0中的一个例子如下:
var stringArray = ["foundation","coredata","coregraphics"]
stringArray = stringArray.filter { $0.contains("core") }
在上面的示例中,由于数组中的每个元素都是一个字符串,因此您可以使用contains
方法过滤数组。
如果数组包含自定义对象,则可以使用该对象的属性来类似地过滤元素。
答案 4 :(得分: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)
}
答案 5 :(得分:5)
我认为这是在Swift中更好的方法:
func filterContentForSearchText(searchText:NSString, scope:NSString)
{
searchResults = recipes.filter { name.rangeOfString(searchText) != nil }
}
答案 6 :(得分:1)
在swift 2.2中
func filterContentForSearchText(searchText: String, scope: String) {
var resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)
searchResults = (recipes as NSArray).filteredArrayUsingPredicate(resultPredicate)
}
在swift 3.0中
func filterContent(forSearchText searchText: String, scope: String) {
var resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)
searchResults = recipes.filtered(using: resultPredicate)
}
答案 7 :(得分:1)
//更改"名称"和"价值"根据你的数组数据。
//更改" yourDataArrayName"名称为您的数组(NSArray)。
let resultPredicate = NSPredicate(format: "SELF.name contains[c] %@", "value")
if let sortedDta = yourDataArrayName.filtered(using: resultPredicate) as? NSArray {
//enter code here.
print(sortedDta)
}