在Swift中使用谓词

时间:2014-06-12 04:47:19

标签: ios objective-c swift ios7 predicate

我正在为我的第一个应用程序完成本教程(学习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创建一个等价物吗?

8 个答案:

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

你会得到(游乐场)

enter image description here

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