Skip to content

Commit f901575

Browse files
committed
implement NSString.stringByTrimmingCharactersInSet
1 parent 590551f commit f901575

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
@@ -676,7 +676,29 @@ extension NSString {
676676
}
677677

678678
public func stringByTrimmingCharactersInSet(set: NSCharacterSet) -> String {
679-
NSUnimplemented()
679+
let characters = _swiftObject.utf16
680+
var start = characters.startIndex
681+
var end = characters.endIndex
682+
683+
for char in characters {
684+
guard set.characterIsMember(char) else {
685+
break
686+
}
687+
688+
start = start.successor()
689+
}
690+
691+
if start < end {
692+
for char in characters.suffixFrom(start).reverse() {
693+
guard set.characterIsMember(char) else {
694+
break
695+
}
696+
697+
end = end.predecessor()
698+
}
699+
}
700+
701+
return String(characters[Range<String.UTF16View.Index>(start: start, end: end)])
680702
}
681703

682704
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
@@ -36,6 +36,7 @@ class TestNSString : XCTestCase {
3636
("test_FromNullTerminatedCStringInUTF8", test_FromNullTerminatedCStringInUTF8 ),
3737
("test_FromMalformedNullTerminatedCStringInUTF8", test_FromMalformedNullTerminatedCStringInUTF8 ),
3838
("test_rangeOfCharacterFromSet", test_rangeOfCharacterFromSet ),
39+
("test_stringByTrimmingCharactersInSet", test_stringByTrimmingCharactersInSet ),
3940
]
4041
}
4142

@@ -164,4 +165,27 @@ class TestNSString : XCTestCase {
164165
XCTAssertEqual(string.rangeOfCharacterFromSet(letters, options: [.BackwardsSearch]).location, 2)
165166
XCTAssertEqual(string.rangeOfCharacterFromSet(letters, options: [], range: NSMakeRange(2, 1)).location, 2)
166167
}
168+
169+
func test_stringByTrimmingCharactersInSet() {
170+
XCTAssertEqual("\u{feff}".stringByTrimmingCharactersInSet(NSCharacterSet.controlCharacterSet()), "")
171+
XCTAssertEqual("a".stringByTrimmingCharactersInSet(NSCharacterSet.letterCharacterSet()), "")
172+
XCTAssertEqual("a".stringByTrimmingCharactersInSet(NSCharacterSet.lowercaseLetterCharacterSet()), "")
173+
XCTAssertEqual("A".stringByTrimmingCharactersInSet(NSCharacterSet.uppercaseLetterCharacterSet()), "")
174+
XCTAssertEqual("\u{01c5}".stringByTrimmingCharactersInSet(NSCharacterSet.uppercaseLetterCharacterSet()), "")
175+
XCTAssertEqual("\u{01c5}".stringByTrimmingCharactersInSet(NSCharacterSet.capitalizedLetterCharacterSet()), "")
176+
XCTAssertEqual("\u{002b}".stringByTrimmingCharactersInSet(NSCharacterSet.symbolCharacterSet()), "")
177+
XCTAssertEqual("\u{20b1}".stringByTrimmingCharactersInSet(NSCharacterSet.symbolCharacterSet()), "")
178+
XCTAssertEqual("\u{000a}".stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet()), "")
179+
XCTAssertEqual("\u{2029}".stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet()), "")
180+
181+
let cset1 = NSCharacterSet(charactersInString: "ABC123")
182+
XCTAssertEqual("".stringByTrimmingCharactersInSet(cset1), "")
183+
XCTAssertEqual("321CBA".stringByTrimmingCharactersInSet(cset1), "", "Should trim everything")
184+
XCTAssertEqual("CBAabc".stringByTrimmingCharactersInSet(cset1), "abc", "Should trim only first 3 characters")
185+
XCTAssertEqual("cbaABC".stringByTrimmingCharactersInSet(cset1), "cba", "Should trim only last 3 characters")
186+
XCTAssertEqual("cba123abc".stringByTrimmingCharactersInSet(cset1), "cba123abc", "Should not trim anything")
187+
188+
let cset2 = NSCharacterSet(charactersInString: "юникодユニコード")
189+
XCTAssertEqual("ЮНИゆにコドкод".stringByTrimmingCharactersInSet(cset2), "ЮНИゆに")
190+
}
167191
}

0 commit comments

Comments
 (0)