ios – Swift – 用于通过成员数组的属性过滤数组的谓词

我需要过滤掉一组MyClass3对象. MyClass2对象的数组是MyClass3对象的成员(请参阅下面的代码). MyClass2对象有一个id.我手边有一个idArray.我需要过滤掉那些MyClass3对象,其中idArray中的所有id都存在于其[MyClass2]成员中.

class MyClass2 : NSObject {
    var uid: Int = 0

    init(uid : Int) {
        self.uid = uid
    }
}

class MyClass3 : NSObject {
    var arr: [MyClass2]

    init(units: [MyClass2]) {
        arr = units
    }
}

var units1 = [MyClass2(uid: 1),MyClass2(uid: 2), MyClass2(uid: 3), MyClass2(uid: 4), MyClass2(uid: 5)]
var units2 = [MyClass2(uid: 4),MyClass2(uid: 5), MyClass2(uid: 6)]
var units3 = [MyClass2(uid: 3),MyClass2(uid: 5), MyClass2(uid: 7), MyClass2(uid: 1)]

var ids = [1,5]

var available3: [MyClass3] = [MyClass3(units: units1), MyClass3(units: units2), MyClass3(units: units3)]
var filtered3: [MyClass3] = []

let searchPredicate: NSPredicate = NSPredicate(format: " ANY arr.uid IN \(ids)") // needed predicate
print(searchPredicate.predicateFormat)
filtered3 = (available3 as NSArray).filteredArrayUsingPredicate(searchPredicate) as! [MyClass3]

要求的答案是我们在过滤后的数组中需要MyClass3(单位:units1)和MyClass3(单位:units3).

这没有用.有人可以为此目的建议谓词格式

最佳答案
在谓词格式字符串中使用字符串插值绝不是一件好事
理念.你谓词的正确形式是

let searchPredicate = NSPredicate(format: "ANY arr.uid IN %@", ids)

但是,检查是否有任何uid在给定列表中.
要检查所有uid是否在给定列表中,请使用以下谓词
应该管用:

let searchPredicate = NSPredicate(format: "SUBQUERY(arr.uid, $x, $x IN %@).@count = %d", ids, ids.count)

如果没有“纯粹的”Swift 3中的谓词,也可以实现相同的目标

filtered3 = available3.filter { $0.arr.filter { ids.contains($0.uid) }.count == ids.count }

要么

filtered3 = available3.filter { Set(ids).isSubset(of: $0.arr.map { $0.uid }) }

转载注明原文:ios – Swift – 用于通过成员数组的属性过滤数组的谓词 - 代码日志