From d9dd1a5dc8aad8a47cdb0d564eb1fc887c525160 Mon Sep 17 00:00:00 2001 From: Jacob Bandes-Storch Date: Thu, 28 Jul 2016 15:48:50 -0700 Subject: [PATCH] [stdlib] default separator for joining strings (SE-0133) --- stdlib/public/core/String.swift | 4 +- test/IDE/print_type_interface.swift | 2 +- validation-test/stdlib/Join.swift.gyb | 70 +++++++++++++-------------- 3 files changed, 36 insertions(+), 40 deletions(-) diff --git a/stdlib/public/core/String.swift b/stdlib/public/core/String.swift index 45f67a6dbc36b..553ce1e9bd8e1 100644 --- a/stdlib/public/core/String.swift +++ b/stdlib/public/core/String.swift @@ -767,9 +767,9 @@ extension Sequence where Iterator.Element == String { /// // Prints "Vivien, Marlon, Kim, Karl" /// /// - Parameter separator: A string to insert between each of the elements - /// in this sequence. + /// in this sequence. The default separator is an empty string. /// - Returns: A single, concatenated string. - public func joined(separator: String) -> String { + public func joined(separator: String = "") -> String { var result = "" // FIXME(performance): this code assumes UTF-16 in-memory representation. diff --git a/test/IDE/print_type_interface.swift b/test/IDE/print_type_interface.swift index 07ef6617b73b5..9a6ab593342dc 100644 --- a/test/IDE/print_type_interface.swift +++ b/test/IDE/print_type_interface.swift @@ -83,4 +83,4 @@ extension D { // TYPE5-DAG: public func split(separator: String, maxSplits: Int = default, omittingEmptySubsequences: Bool = default) -> [ArraySlice] // TYPE5-DAG: public func formIndex(_ i: inout Int, offsetBy n: Int) // TYPE5-DAG: public func distance(from start: Int, to end: Int) -> Int -// TYPE5-DAG: public func joined(separator: String) -> String +// TYPE5-DAG: public func joined(separator: String = default) -> String diff --git a/validation-test/stdlib/Join.swift.gyb b/validation-test/stdlib/Join.swift.gyb index 2cf86103e2546..7709a2324fd76 100644 --- a/validation-test/stdlib/Join.swift.gyb +++ b/validation-test/stdlib/Join.swift.gyb @@ -277,7 +277,7 @@ collections += [(array, 'RandomAccess') for array in other_array_types] % label = '' % end -JoinTestSuite.test("${Base}.join()") { +JoinTestSuite.test("${Base}.joined(separator:)") { for test in joinWithSeparatorTests { let elements = ${Base}(${label} test.elements.map { ${Base}(${label} $0) @@ -288,7 +288,7 @@ JoinTestSuite.test("${Base}.join()") { } } -JoinTestSuite.test("${Base}.join()/_copyToContiguousArray()") { +JoinTestSuite.test("${Base}.joined(separator:)/_copyToContiguousArray()") { for test in joinWithSeparatorTests { let elements = ${Base}(${label} test.elements.map { ${Base}(${label} $0) @@ -301,47 +301,43 @@ JoinTestSuite.test("${Base}.join()/_copyToContiguousArray()") { % end -func join(_ separator: String, _ elements: [String]) -> String { - return elements.joined(separator: separator) -} - -JoinTestSuite.test("String.joined(separator:)") { - // - // Test the free function. - // +JoinTestSuite.test("Sequence.joined(separator:)") { + // Default separator (empty). + expectEqual("", [].joined()) + expectEqual("", [""].joined()) + expectEqual("", ["", ""].joined()) + expectEqual("", ["", "", ""].joined()) + expectEqual("a", ["a"].joined()) + expectEqual("ab", ["a", "b"].joined()) + expectEqual("abc", ["a", "b", "c"].joined()) + expectEqual("abcdef", ["ab", "cd", "ef"].joined()) // Empty separator. - expectEqual("", join("", [])) - expectEqual("", join("", [""])) - expectEqual("", join("", ["", ""])) - expectEqual("", join("", ["", "", ""])) - expectEqual("a", join("", ["a"])) - expectEqual("ab", join("", ["a", "b"])) - expectEqual("abc", join("", ["a", "b", "c"])) - expectEqual("abcdef", join("", ["ab", "cd", "ef"])) + expectEqual("", [].joined(separator: "")) + expectEqual("", [""].joined(separator: "")) + expectEqual("", ["", ""].joined(separator: "")) + expectEqual("", ["", "", ""].joined(separator: "")) + expectEqual("a", ["a"].joined(separator: "")) + expectEqual("ab", ["a", "b"].joined(separator: "")) + expectEqual("abc", ["a", "b", "c"].joined(separator: "")) + expectEqual("abcdef", ["ab", "cd", "ef"].joined(separator: "")) // 1-element separator. - expectEqual("", join("x", [""])) - expectEqual("x", join("x", ["", ""])) - expectEqual("xx", join("x", ["", "", ""])) - expectEqual("a", join("x", ["a"])) - expectEqual("axb", join("x", ["a", "b"])) - expectEqual("axbxc", join("x", ["a", "b", "c"])) - expectEqual("abxcdxef", join("x", ["ab", "cd", "ef"])) + expectEqual("", [""].joined(separator: "x")) + expectEqual("x", ["", ""].joined(separator: "x")) + expectEqual("xx", ["", "", ""].joined(separator: "x")) + expectEqual("a", ["a"].joined(separator: "x")) + expectEqual("axb", ["a", "b"].joined(separator: "x")) + expectEqual("axbxc", ["a", "b", "c"].joined(separator: "x")) + expectEqual("abxcdxef", ["ab", "cd", "ef"].joined(separator: "x")) // 2-element separator. - expectEqual("", join("xy", [""])) - expectEqual("xy", join("xy", ["", ""])) - expectEqual("xyxy", join("xy", ["", "", ""])) - expectEqual("a", join("xy", ["a"])) - expectEqual("axyb", join("xy", ["a", "b"])) - expectEqual("axybxyc", join("xy", ["a", "b", "c"])) - expectEqual("abxycdxyef", join("xy", ["ab", "cd", "ef"])) - - // - // Test forwarding instance function. - // - + expectEqual("", [""].joined(separator: "xy")) + expectEqual("xy", ["", ""].joined(separator: "xy")) + expectEqual("xyxy", ["", "", ""].joined(separator: "xy")) + expectEqual("a", ["a"].joined(separator: "xy")) + expectEqual("axyb", ["a", "b"].joined(separator: "xy")) + expectEqual("axybxyc", ["a", "b", "c"].joined(separator: "xy")) expectEqual("abxycdxyef", ["ab", "cd", "ef"].joined(separator: "xy")) }