如何使用数组创建 NSPredicate 包含元素

Bar*_*zyk 3 core-data nspredicate ios swift

我只是Address有财产的实体favourites类型的[String]

地址

@objc(Address)
class Address: NSManagedObject, Observer {
    @NSManaged var favourites: [String]
}
Run Code Online (Sandbox Code Playgroud)

假设我有一些地址:

1: favourites: ["a", "b", "c"]
2: favourites: ["b", "c"]
3: favourites: ["a", "c"]
4: favourites: ["a"]
5: favourites: ["b"]
Run Code Online (Sandbox Code Playgroud)

现在我需要在a里面获取所有地址favourites。所以结果应该是:1, 3, 4

换句话说,我需要检查是否ANY element在数组中is equal为特定字符串,然后应该返回对象。

以下不起作用:

NSPredicate(format: "favourites CONTAINS %@", "a")
Run Code Online (Sandbox Code Playgroud)

这是它的定义方式xcdatamodel

在此处输入图片说明

Mar*_*n R 7

您不能在定义为具有谓词的可转换属性的数组中进行搜索。更好地定义另一个实体

@objc(Favourite)
class Favourite: NSManagedObject {
    @NSManaged var name: String
}
Run Code Online (Sandbox Code Playgroud)

以及从“地址”到“收藏夹”的一对多关系。

您可以使用谓词获取具有任何(即:至少一个)喜欢的地址等于字符串“a”的所有地址

NSPredicate(format: "ANY favourites.name == %@", "a")
Run Code Online (Sandbox Code Playgroud)

或者使用编译器检查的键路径文字更好:

NSPredicate(format: "ANY %K == %@", #keyPath(Address.favourites.name), "a")
Run Code Online (Sandbox Code Playgroud)

对于不区分大小写的比较,您可以使用

NSPredicate(format: "ANY %K ==[c] %@", #keyPath(Address.favourites.name), "a")
Run Code Online (Sandbox Code Playgroud)