Skip to content

Commit 373ba02

Browse files
committed
implement NSString.stringByTrimmingCharactersInSet
1 parent 0bfcd82 commit 373ba02

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

Foundation/NSString.swift

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,29 @@ extension NSString {
638638
}
639639

640640
public func stringByTrimmingCharactersInSet(set: NSCharacterSet) -> String {
641-
NSUnimplemented()
641+
let characters = _swiftObject.utf16
642+
var start = characters.startIndex
643+
var end = characters.endIndex
644+
645+
for char in characters {
646+
guard set.characterIsMember(char) else {
647+
break
648+
}
649+
650+
start = start.successor()
651+
}
652+
653+
if start < end {
654+
for char in characters.suffixFrom(start).reverse() {
655+
guard set.characterIsMember(char) else {
656+
break
657+
}
658+
659+
end = end.predecessor()
660+
}
661+
}
662+
663+
return String(characters[Range<String.UTF16View.Index>(start: start, end: end)])
642664
}
643665

644666
public func stringByPaddingToLength(newLength: Int, withString padString: String, startingAtIndex padIndex: Int) -> String {

TestFoundation/TestNSString.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class TestNSString : XCTestCase {
3232
("test_FromNullTerminatedCStringInASCII", test_FromNullTerminatedCStringInASCII ),
3333
("test_FromNullTerminatedCStringInUTF8", test_FromNullTerminatedCStringInUTF8 ),
3434
("test_FromMalformedNullTerminatedCStringInUTF8", test_FromMalformedNullTerminatedCStringInUTF8 ),
35+
("test_stringByTrimmingCharactersInSet", test_stringByTrimmingCharactersInSet ),
3536
]
3637
}
3738

@@ -127,4 +128,27 @@ class TestNSString : XCTestCase {
127128
let string = NSString(CString: bytes.map { Int8(bitPattern: $0) }, encoding: NSUTF8StringEncoding)
128129
XCTAssertNil(string)
129130
}
131+
132+
func test_stringByTrimmingCharactersInSet() {
133+
XCTAssertEqual("\u{feff}".stringByTrimmingCharactersInSet(NSCharacterSet.controlCharacterSet()), "")
134+
XCTAssertEqual("a".stringByTrimmingCharactersInSet(NSCharacterSet.letterCharacterSet()), "")
135+
XCTAssertEqual("a".stringByTrimmingCharactersInSet(NSCharacterSet.lowercaseLetterCharacterSet()), "")
136+
XCTAssertEqual("A".stringByTrimmingCharactersInSet(NSCharacterSet.uppercaseLetterCharacterSet()), "")
137+
XCTAssertEqual("\u{01c5}".stringByTrimmingCharactersInSet(NSCharacterSet.uppercaseLetterCharacterSet()), "")
138+
XCTAssertEqual("\u{01c5}".stringByTrimmingCharactersInSet(NSCharacterSet.capitalizedLetterCharacterSet()), "")
139+
XCTAssertEqual("\u{002b}".stringByTrimmingCharactersInSet(NSCharacterSet.symbolCharacterSet()), "")
140+
XCTAssertEqual("\u{20b1}".stringByTrimmingCharactersInSet(NSCharacterSet.symbolCharacterSet()), "")
141+
XCTAssertEqual("\u{000a}".stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet()), "")
142+
XCTAssertEqual("\u{2029}".stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet()), "")
143+
144+
let cset1 = NSCharacterSet(charactersInString: "ABC123")
145+
XCTAssertEqual("".stringByTrimmingCharactersInSet(cset1), "")
146+
XCTAssertEqual("321CBA".stringByTrimmingCharactersInSet(cset1), "", "Should trim everything")
147+
XCTAssertEqual("CBAabc".stringByTrimmingCharactersInSet(cset1), "abc", "Should trim only first 3 characters")
148+
XCTAssertEqual("cbaABC".stringByTrimmingCharactersInSet(cset1), "cba", "Should trim only last 3 characters")
149+
XCTAssertEqual("cba123abc".stringByTrimmingCharactersInSet(cset1), "cba123abc", "Should not trim anything")
150+
151+
let cset2 = NSCharacterSet(charactersInString: "юникодユニコード")
152+
XCTAssertEqual("ЮНИゆにコドкод".stringByTrimmingCharactersInSet(cset2), "ЮНИゆに")
153+
}
130154
}

0 commit comments

Comments
 (0)