我正在为我的第一个应用程序浏览本教程(学习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创建等效项?
这实际上只是语法切换。好,所以我们有这个方法调用:
[NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
在Swift中,构造函数跳过“ blahWith…”部分,仅将类名用作函数,然后直接进入参数,因此[NSPredicate predicateWithFormat: …]将变为NSPredicate(format: …)。(例如,[NSArray arrayWithObject: …]将变为NSArray(object: …)。这是Swift中的常规模式。)
[NSPredicate predicateWithFormat: …]
NSPredicate(format: …)
[NSArray arrayWithObject: …]
NSArray(object: …)
所以现在我们只需要将参数传递给构造函数即可。在Objective- C中,NSString文字看起来像@"",但是在Swift中,我们仅对字符串使用引号。这样就给我们:
@""
let resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)
实际上,这正是我们这里需要的。
(顺便说一句,您会注意到其他一些答案,而不是使用格式字符串,如"name contains[c] \(searchText)"。那是不正确的。它使用字符串插值,这与谓词格式不同,通常对此不起作用。)
"name contains[c] \(searchText)"