Skip to content

Commit e8b21b3

Browse files
committed
Merge branch 'pr/319'
2 parents b94d017 + 2e03bfb commit e8b21b3

File tree

2 files changed

+88
-15
lines changed

2 files changed

+88
-15
lines changed

Foundation/NSPredicate.swift

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,25 +89,51 @@ extension NSArray {
8989
}
9090

9191
extension NSMutableArray {
92-
public func filterUsingPredicate(_ predicate: NSPredicate) { NSUnimplemented() } // evaluate a predicate against an array of objects and filter the mutable array directly
92+
public func filterUsingPredicate(_ predicate: NSPredicate) {
93+
let indexesToRemove = NSMutableIndexSet()
94+
for (index, object) in self.enumerated() {
95+
if !predicate.evaluateWithObject(object) {
96+
indexesToRemove.addIndex(index)
97+
}
98+
}
99+
self.removeObjectsAtIndexes(indexesToRemove)
100+
} // evaluate a predicate against an array of objects and filter the mutable array directly
93101
}
94102

95103
extension NSSet {
96-
public func filteredSetUsingPredicate(_ predicate: NSPredicate) -> Set<NSObject> { NSUnimplemented() } // evaluate a predicate against a set of objects and return a filtered set
104+
public func filteredSetUsingPredicate(_ predicate: NSPredicate) -> Set<NSObject> {
105+
return Set(bridge().filter({ object in
106+
return predicate.evaluateWithObject(object)
107+
}))
108+
} // evaluate a predicate against a set of objects and return a filtered set
97109
}
98110

99111
extension NSMutableSet {
100-
public func filterUsingPredicate(_ predicate: NSPredicate) { NSUnimplemented() } // evaluate a predicate against a set of objects and filter the mutable set directly
112+
public func filterUsingPredicate(_ predicate: NSPredicate) {
113+
for object in self {
114+
if !predicate.evaluateWithObject(object) {
115+
self.removeObject(object)
116+
}
117+
}
118+
} // evaluate a predicate against a set of objects and filter the mutable set directly
101119
}
102120

103121
extension NSOrderedSet {
104-
105-
public func filteredOrderedSetUsingPredicate(_ p: NSPredicate) -> NSOrderedSet { NSUnimplemented() } // evaluate a predicate against an ordered set of objects and return a filtered ordered set
122+
public func filteredOrderedSetUsingPredicate(_ predicate: NSPredicate) -> NSOrderedSet {
123+
return NSOrderedSet(array: self._orderedStorage.bridge().filter({ object in
124+
return predicate.evaluateWithObject(object)
125+
}))
126+
} // evaluate a predicate against an ordered set of objects and return a filtered ordered set
106127
}
107128

108129
extension NSMutableOrderedSet {
109-
110-
public func filterUsingPredicate(_ p: NSPredicate) { NSUnimplemented() } // evaluate a predicate against an ordered set of objects and filter the mutable ordered set directly
130+
public func filterUsingPredicate(_ predicate: NSPredicate) {
131+
let indexesToRemove = NSMutableIndexSet()
132+
for (index, object) in self.enumerated() {
133+
if !predicate.evaluateWithObject(object) {
134+
indexesToRemove.addIndex(index)
135+
}
136+
}
137+
self.removeObjectsAtIndexes(indexesToRemove)
138+
} // evaluate a predicate against an ordered set of objects and filter the mutable ordered set directly
111139
}
112-
113-

TestFoundation/TestNSPredicate.swift

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ class TestNSPredicate: XCTestCase {
2222
("test_BooleanPredicate", test_BooleanPredicate),
2323
("test_BlockPredicateWithoutVariableBindings", test_BlockPredicateWithoutVariableBindings),
2424
("test_filterNSArray", test_filterNSArray),
25+
("test_filterNSMutableArray", test_filterNSMutableArray),
26+
("test_filterNSSet", test_filterNSSet),
27+
("test_filterNSMutableSet", test_filterNSMutableSet),
28+
("test_filterNSOrderedSet", test_filterNSOrderedSet),
29+
("test_filterNSMutableOrderedSet", test_filterNSMutableOrderedSet),
2530
]
2631
}
2732

@@ -43,15 +48,57 @@ class TestNSPredicate: XCTestCase {
4348
XCTAssertFalse(isNSStringPredicate.evaluateWithObject(NSArray()))
4449
}
4550

51+
let lengthLessThanThreePredicate = NSPredicate { (obj, bindings) -> Bool in
52+
return (obj as? NSString).map({ $0.length < 3 }) == true
53+
}
54+
55+
let startArray = ["1".bridge(), "12".bridge(), "123".bridge(), "1234".bridge()]
56+
let expectedArray = ["1".bridge(), "12".bridge()]
4657

4758
func test_filterNSArray() {
48-
let predicate = NSPredicate { (obj, bindings) -> Bool in
49-
return (obj as? NSString).map({ $0.length <= 2 }) == true
50-
}
59+
let array = NSArray(array: startArray)
60+
let filteredArray = array.filteredArrayUsingPredicate(lengthLessThanThreePredicate).bridge()
61+
62+
XCTAssertEqual(expectedArray.bridge(), filteredArray)
63+
}
64+
65+
func test_filterNSMutableArray() {
66+
let array = NSMutableArray(array: startArray)
67+
68+
array.filterUsingPredicate(lengthLessThanThreePredicate)
69+
70+
XCTAssertEqual(expectedArray.bridge(), array)
71+
}
72+
73+
func test_filterNSSet() {
74+
let set = Set(startArray).bridge()
75+
let filteredSet = set.filteredSetUsingPredicate(lengthLessThanThreePredicate).bridge()
76+
77+
XCTAssertEqual(Set(expectedArray).bridge(), filteredSet)
78+
}
79+
80+
func test_filterNSMutableSet() {
81+
let set = NSMutableSet(objects: ["1".bridge(), "12".bridge(), "123".bridge(), "1234".bridge()], count: 4)
82+
set.filterUsingPredicate(lengthLessThanThreePredicate)
83+
84+
XCTAssertEqual(Set(expectedArray).bridge(), set)
85+
}
86+
87+
func test_filterNSOrderedSet() {
88+
let orderedSet = NSOrderedSet(array: startArray)
89+
let filteredOrderedSet = orderedSet.filteredOrderedSetUsingPredicate(lengthLessThanThreePredicate)
90+
91+
XCTAssertEqual(NSOrderedSet(array: expectedArray), filteredOrderedSet)
92+
}
93+
94+
func test_filterNSMutableOrderedSet() {
95+
let orderedSet = NSMutableOrderedSet()
96+
orderedSet.addObjectsFromArray(startArray)
5197

52-
let array = NSArray(array: ["1".bridge(), "12".bridge(), "123".bridge(), "1234".bridge()])
53-
let filteredArray = array.filteredArrayUsingPredicate(predicate).bridge()
98+
orderedSet.filterUsingPredicate(lengthLessThanThreePredicate)
5499

55-
XCTAssertEqual(["1".bridge(), "12".bridge()].bridge(), filteredArray)
100+
let expectedOrderedSet = NSMutableOrderedSet()
101+
expectedOrderedSet.addObjectsFromArray(expectedArray)
102+
XCTAssertEqual(expectedOrderedSet, orderedSet)
56103
}
57104
}

0 commit comments

Comments
 (0)