From cd5abf31d88c4f3987f801c97057e6a5bb010b38 Mon Sep 17 00:00:00 2001 From: Kare Morstol Date: Thu, 6 Nov 2014 00:04:51 +0100 Subject: [PATCH] Add version of `replace` method with limit. Also rename parameters in original version. --- SwiftShell/String.swift | 15 ++++++++++++--- SwiftShellTests/String_Tests.swift | 26 ++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/SwiftShell/String.swift b/SwiftShell/String.swift index fc3e1b5..78f5973 100644 --- a/SwiftShell/String.swift +++ b/SwiftShell/String.swift @@ -12,9 +12,18 @@ import Foundation extension String { - - public func replace (replaceOldString: String, _ withString: String) -> String { - return self.stringByReplacingOccurrencesOfString(replaceOldString, withString: withString) + + public func replace (oldString: String, _ newString: String) -> String { + return self.stringByReplacingOccurrencesOfString(oldString, withString: newString) + } + + /** Replace the first `limit` occurrences of oldString with newString. */ + public func replace (oldString: String, _ newString: String, limit: Int) -> String { + let ranges = self.findAll(oldString) |> take(limit) + return ranges.count == 0 + ? self + : self.stringByReplacingOccurrencesOfString(oldString, withString: newString, + range: ranges.first!.startIndex ..< ranges.last!.endIndex) } public func split (sep: String) -> [String] { diff --git a/SwiftShellTests/String_Tests.swift b/SwiftShellTests/String_Tests.swift index ed40654..e37b8c7 100644 --- a/SwiftShellTests/String_Tests.swift +++ b/SwiftShellTests/String_Tests.swift @@ -34,4 +34,30 @@ class String_Tests: XCTestCase { XCTAssertEqual(ranges("a ").count, 2) } + + func testReplaceStringwithstring () { + let text = "a b c aa bb cc ab bc ca" + + XCTAssertEqual( text.replace("a", "x"), "x b c xx bb cc xb bc cx") + XCTAssertEqual( text.replace("b ", "x"), "a xc aa bxcc axbc ca") + } + + func testReplaceOnlySomeStringsWithString () { + let text = "a b c aa bb cc ab bc ca" + + XCTAssertEqual( text.replace("a", "x", limit: 0), "a b c aa bb cc ab bc ca") + XCTAssertEqual( text.replace("a", "x", limit: 2), "x b c xa bb cc ab bc ca") + XCTAssertEqual( text.replace("a", "x", limit: 4), "x b c xx bb cc xb bc ca") + XCTAssertEqual( text.replace("a", "x", limit: 5), "x b c xx bb cc xb bc cx") + XCTAssertEqual( text.replace("a", "x", limit: 6), "x b c xx bb cc xb bc cx") + + XCTAssertEqual( text.replace("a", "[xy]", limit: 4), "[xy] b c [xy][xy] bb cc [xy]b bc ca") + XCTAssertEqual( text.replace("a", "[xy]", limit: 5), "[xy] b c [xy][xy] bb cc [xy]b bc c[xy]") + XCTAssertEqual( text.replace("a", "[xy]", limit: 6), "[xy] b c [xy][xy] bb cc [xy]b bc c[xy]") + + XCTAssertEqual( text.replace("a ", "x", limit: 0), "a b c aa bb cc ab bc ca") + XCTAssertEqual( text.replace("a ", "x", limit: 1), "xb c aa bb cc ab bc ca") + XCTAssertEqual( text.replace("a ", "x", limit: 2), "xb c axbb cc ab bc ca") + XCTAssertEqual( text.replace("a ", "x", limit: 3), "xb c axbb cc ab bc ca") + } }