簡體   English   中英

Swift - 用於通過成員數組的屬性過濾數組的謂詞

[英]Swift - Predicate to filter an array by a property of member array

我需要過濾掉一組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 }) }

您可以使用執行交集操作而不是NSPredicate:

請參閱以下鏈接

在Swift數組上設置操作(union,intersection)?

您可以查看此鏈接以獲取良好示例,但是對於數組的過濾,您可以使用以下內容:

filteredArray = wholeArray.filter{ !unwantedArray.contains($0)}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM