一尘不染

在Swift中使用谓词

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

谁能建议如何在Swift中为NSPredicate创建等效项?


阅读 382

收藏
2020-07-07

共1个答案

一尘不染

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

[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)"。那是不正确的。它使用字符串插值,这与谓词格式不同,通常对此不起作用。)

2020-07-07