Skip to content

Commit 654e5fa

Browse files
authored
Merge pull request #1404 from spevans/pr_nsarray_paths_matching_extensions
2 parents a4ca69e + 1b8055a commit 654e5fa

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

Foundation/NSArray.swift

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,26 @@ open class NSArray : NSObject, NSCopying, NSMutableCopying, NSSecureCoding, NSCo
653653
}
654654

655655
open func pathsMatchingExtensions(_ filterTypes: [String]) -> [String] {
656-
NSUnimplemented()
656+
guard filterTypes.count > 0 else {
657+
return []
658+
}
659+
660+
let extensions: [String] = filterTypes.map {
661+
var ext = "."
662+
ext.append($0)
663+
return ext
664+
}
665+
666+
return self.filter {
667+
// The force unwrap will abort if the element is not a String but this behaviour matches Dawrin, which throws an exception.
668+
let filename = $0 as! String
669+
for ext in extensions {
670+
if filename.hasSuffix(ext) && filename.count > ext.count {
671+
return true
672+
}
673+
}
674+
return false
675+
} as! [String]
657676
}
658677

659678
override open var _cfTypeID: CFTypeID {

TestFoundation/TestNSArray.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class TestNSArray : XCTestCase {
5151
("test_insertObjectAtIndex", test_insertObjectAtIndex),
5252
("test_insertObjectsAtIndexes", test_insertObjectsAtIndexes),
5353
("test_replaceObjectsAtIndexesWithObjects", test_replaceObjectsAtIndexesWithObjects),
54+
("test_pathsMatchingExtensions", test_pathsMatchingExtensions),
5455
]
5556
}
5657

@@ -746,6 +747,24 @@ class TestNSArray : XCTestCase {
746747
XCTAssertEqual(a3, ["a", "b", "c", "d"])
747748
}
748749

750+
func test_pathsMatchingExtensions() {
751+
let paths = NSArray(arrayLiteral: "file1.txt", "/tmp/file2.txt", "file3.jpg", "file3.png", "/file4.png", "txt", ".txt")
752+
let match1 = paths.pathsMatchingExtensions(["txt"])
753+
XCTAssertEqual(match1, ["file1.txt", "/tmp/file2.txt"])
754+
755+
let match2 = paths.pathsMatchingExtensions([])
756+
XCTAssertEqual(match2, [])
757+
758+
let match3 = paths.pathsMatchingExtensions([".txt", "png"])
759+
XCTAssertEqual(match3, ["file3.png", "/file4.png"])
760+
761+
let match4 = paths.pathsMatchingExtensions(["", ".tx", "tx"])
762+
XCTAssertEqual(match4, [])
763+
764+
let match5 = paths.pathsMatchingExtensions(["..txt"])
765+
XCTAssertEqual(match5, [])
766+
}
767+
749768
private func createTestFile(_ path: String, _contents: Data) -> String? {
750769
let tempDir = NSTemporaryDirectory() + "TestFoundation_Playground_" + NSUUID().uuidString + "/"
751770
do {

0 commit comments

Comments
 (0)