Skip to content

Commit 75dc2d0

Browse files
committed
Merge pull request #75 from jpsim/NSString.rangeOfCharacterFromSet
implement NSString.rangeOfCharacterFromSet
2 parents 3deadec + 6c1cab3 commit 75dc2d0

File tree

2 files changed

+39
-4
lines changed

2 files changed

+39
-4
lines changed

Foundation/NSString.swift

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -405,15 +405,39 @@ extension NSString {
405405
}
406406

407407
public func rangeOfCharacterFromSet(searchSet: NSCharacterSet) -> NSRange {
408-
NSUnimplemented()
408+
return rangeOfCharacterFromSet(searchSet, options: [])
409409
}
410410

411411
public func rangeOfCharacterFromSet(searchSet: NSCharacterSet, options mask: NSStringCompareOptions) -> NSRange {
412-
NSUnimplemented()
412+
return rangeOfCharacterFromSet(searchSet, options: mask, range: NSMakeRange(0, length))
413413
}
414414

415415
public func rangeOfCharacterFromSet(searchSet: NSCharacterSet, options mask: NSStringCompareOptions, range searchRange: NSRange) -> NSRange {
416-
NSUnimplemented()
416+
if mask.contains(.RegularExpressionSearch) {
417+
NSUnimplemented()
418+
}
419+
if searchRange.length == 0 {
420+
return NSMakeRange(NSNotFound, 0)
421+
}
422+
423+
#if os(Linux)
424+
var cfflags = CFStringCompareFlags(mask.rawValue)
425+
if mask.contains(.LiteralSearch) {
426+
cfflags |= UInt(kCFCompareNonliteral)
427+
}
428+
#else
429+
var cfflags = CFStringCompareFlags(rawValue: mask.rawValue)
430+
if mask.contains(.LiteralSearch) {
431+
cfflags.unionInPlace(.CompareNonliteral)
432+
}
433+
#endif
434+
var result = CFRangeMake(kCFNotFound, 0)
435+
436+
if CFStringFindCharacterFromSet(_cfObject, searchSet._cfObject, CFRangeMake(searchRange.location, searchRange.length), cfflags, &result) {
437+
return NSMakeRange(result.location, result.length)
438+
} else {
439+
return NSMakeRange(NSNotFound, 0)
440+
}
417441
}
418442

419443
public func rangeOfComposedCharacterSequenceAtIndex(index: Int) -> NSRange {

TestFoundation/TestNSString.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class TestNSString : XCTestCase {
3434
("test_FromNullTerminatedCStringInASCII", test_FromNullTerminatedCStringInASCII ),
3535
("test_FromNullTerminatedCStringInUTF8", test_FromNullTerminatedCStringInUTF8 ),
3636
("test_FromMalformedNullTerminatedCStringInUTF8", test_FromMalformedNullTerminatedCStringInUTF8 ),
37+
("test_rangeOfCharacterFromSet", test_rangeOfCharacterFromSet ),
3738
]
3839
}
3940

@@ -141,4 +142,14 @@ class TestNSString : XCTestCase {
141142
let string = NSString(CString: bytes.map { Int8(bitPattern: $0) }, encoding: NSUTF8StringEncoding)
142143
XCTAssertNil(string)
143144
}
144-
}
145+
146+
func test_rangeOfCharacterFromSet() {
147+
let string: NSString = "0Az"
148+
let letters = NSCharacterSet.letterCharacterSet()
149+
let decimalDigits = NSCharacterSet.decimalDigitCharacterSet()
150+
XCTAssertEqual(string.rangeOfCharacterFromSet(letters).location, 1)
151+
XCTAssertEqual(string.rangeOfCharacterFromSet(decimalDigits).location, 0)
152+
XCTAssertEqual(string.rangeOfCharacterFromSet(letters, options: [.BackwardsSearch]).location, 2)
153+
XCTAssertEqual(string.rangeOfCharacterFromSet(letters, options: [], range: NSMakeRange(2, 1)).location, 2)
154+
}
155+
}

0 commit comments

Comments
 (0)