diff --git a/Foundation/NSString.swift b/Foundation/NSString.swift index 87eb12ebf8..fc4ae5ddc6 100644 --- a/Foundation/NSString.swift +++ b/Foundation/NSString.swift @@ -405,15 +405,39 @@ extension NSString { } public func rangeOfCharacterFromSet(searchSet: NSCharacterSet) -> NSRange { - NSUnimplemented() + return rangeOfCharacterFromSet(searchSet, options: []) } public func rangeOfCharacterFromSet(searchSet: NSCharacterSet, options mask: NSStringCompareOptions) -> NSRange { - NSUnimplemented() + return rangeOfCharacterFromSet(searchSet, options: mask, range: NSMakeRange(0, length)) } public func rangeOfCharacterFromSet(searchSet: NSCharacterSet, options mask: NSStringCompareOptions, range searchRange: NSRange) -> NSRange { - NSUnimplemented() + if mask.contains(.RegularExpressionSearch) { + NSUnimplemented() + } + if searchRange.length == 0 { + return NSMakeRange(NSNotFound, 0) + } + +#if os(Linux) + var cfflags = CFStringCompareFlags(mask.rawValue) + if mask.contains(.LiteralSearch) { + cfflags |= UInt(kCFCompareNonliteral) + } +#else + var cfflags = CFStringCompareFlags(rawValue: mask.rawValue) + if mask.contains(.LiteralSearch) { + cfflags.unionInPlace(.CompareNonliteral) + } +#endif + var result = CFRangeMake(kCFNotFound, 0) + + if CFStringFindCharacterFromSet(_cfObject, searchSet._cfObject, CFRangeMake(searchRange.location, searchRange.length), cfflags, &result) { + return NSMakeRange(result.location, result.length) + } else { + return NSMakeRange(NSNotFound, 0) + } } public func rangeOfComposedCharacterSequenceAtIndex(index: Int) -> NSRange { diff --git a/TestFoundation/TestNSString.swift b/TestFoundation/TestNSString.swift index 8eda160cf1..ff3bb0528f 100644 --- a/TestFoundation/TestNSString.swift +++ b/TestFoundation/TestNSString.swift @@ -34,6 +34,7 @@ class TestNSString : XCTestCase { ("test_FromNullTerminatedCStringInASCII", test_FromNullTerminatedCStringInASCII ), ("test_FromNullTerminatedCStringInUTF8", test_FromNullTerminatedCStringInUTF8 ), ("test_FromMalformedNullTerminatedCStringInUTF8", test_FromMalformedNullTerminatedCStringInUTF8 ), + ("test_rangeOfCharacterFromSet", test_rangeOfCharacterFromSet ), ] } @@ -141,4 +142,14 @@ class TestNSString : XCTestCase { let string = NSString(CString: bytes.map { Int8(bitPattern: $0) }, encoding: NSUTF8StringEncoding) XCTAssertNil(string) } -} \ No newline at end of file + + func test_rangeOfCharacterFromSet() { + let string: NSString = "0Az" + let letters = NSCharacterSet.letterCharacterSet() + let decimalDigits = NSCharacterSet.decimalDigitCharacterSet() + XCTAssertEqual(string.rangeOfCharacterFromSet(letters).location, 1) + XCTAssertEqual(string.rangeOfCharacterFromSet(decimalDigits).location, 0) + XCTAssertEqual(string.rangeOfCharacterFromSet(letters, options: [.BackwardsSearch]).location, 2) + XCTAssertEqual(string.rangeOfCharacterFromSet(letters, options: [], range: NSMakeRange(2, 1)).location, 2) + } +}