2016-10-17 3 views
2

MyClass3 개체의 배열을 필터링해야합니다. MyClass2 객체의 배열은 MyClass3 객체의 멤버입니다 (아래 코드 참조). MyClass2 객체에는 ID가 있습니다. 내가 가지고있는 idArray가 있습니다. idArray의 모든 ID가 [MyClass2] 멤버에있는 MyClass3 객체를 필터링해야합니다. 및 MyClass3 (단위 : units3) 필터 배열에서 :Swift - 구성원 배열의 속성으로 배열을 필터링하기위한 조건부

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 (장치 1 대)를 필요로한다는 것이다.

이것은 제대로 작동하지 않습니다. 누군가가이 목적을 위해 술어 형식을 제안 할 수

답변

7

을 위해 아래 링크를 참조하십시오 좋은 아이디어. 당신의 술어의 정확한 형태는 UID와의 어떤이 주어진 목록에 있는지 확인 그러나

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

될 것이다. 모든 UID가 지정된 목록에있는 경우 확인하려면 다음과 같은 조건 작동합니다 :

같은이

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

로 스위프트 3 "순수"에 조건없이 달성 할 수

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

또는

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

고마워요 :) 그것은 효과가있어. –

1

할 수 있습니다 대신 자 NSPredicate의 교차 작업을 수행하여 수행

술어 형식 문자열의 문자열 보간은 사용이

Set operations (union, intersection) on Swift array?

+0

idArray를 사용하여 필터링 할 다른 사용자 정의 배열을 포함하는 사용자 정의 배열이 있으므로 직접이 작업을 수행 할 수 없습니다. –

+0

이 작업을 사용하여 수행 할 수 있지만 원하는 결과에 대한 일부 논리를 수행해야합니다. – KKRocks

+0

확인. 보이는 것입니다 –

0

좋은 예를 보려면 link을 확인하면되지만 배열을 조롱하면 다음과 같은 것을 사용할 수 있습니다 :

filteredArray = wholeArray.filter{ !unwantedArray.contains($0)} 
관련 문제