Skip to content

Commit 308f990

Browse files
jtbandestkremenek
authored andcommitted
[stdlib] default separator for joining strings (SE-0133) (#3838)
1 parent d933d5a commit 308f990

File tree

3 files changed

+36
-40
lines changed

3 files changed

+36
-40
lines changed

stdlib/public/core/String.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -767,9 +767,9 @@ extension Sequence where Iterator.Element == String {
767767
/// // Prints "Vivien, Marlon, Kim, Karl"
768768
///
769769
/// - Parameter separator: A string to insert between each of the elements
770-
/// in this sequence.
770+
/// in this sequence. The default separator is an empty string.
771771
/// - Returns: A single, concatenated string.
772-
public func joined(separator: String) -> String {
772+
public func joined(separator: String = "") -> String {
773773
var result = ""
774774

775775
// FIXME(performance): this code assumes UTF-16 in-memory representation.

test/IDE/print_type_interface.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,4 @@ extension D {
8383
// TYPE5-DAG: public func split(separator: String, maxSplits: Int = default, omittingEmptySubsequences: Bool = default) -> [ArraySlice<String>]
8484
// TYPE5-DAG: public func formIndex(_ i: inout Int, offsetBy n: Int)
8585
// TYPE5-DAG: public func distance(from start: Int, to end: Int) -> Int
86-
// TYPE5-DAG: public func joined(separator: String) -> String
86+
// TYPE5-DAG: public func joined(separator: String = default) -> String

validation-test/stdlib/Join.swift.gyb

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ collections += [(array, 'RandomAccess') for array in other_array_types]
277277
% label = ''
278278
% end
279279

280-
JoinTestSuite.test("${Base}.join()") {
280+
JoinTestSuite.test("${Base}.joined(separator:)") {
281281
for test in joinWithSeparatorTests {
282282
let elements = ${Base}(${label} test.elements.map {
283283
${Base}(${label} $0)
@@ -288,7 +288,7 @@ JoinTestSuite.test("${Base}.join()") {
288288
}
289289
}
290290

291-
JoinTestSuite.test("${Base}.join()/_copyToContiguousArray()") {
291+
JoinTestSuite.test("${Base}.joined(separator:)/_copyToContiguousArray()") {
292292
for test in joinWithSeparatorTests {
293293
let elements = ${Base}(${label} test.elements.map {
294294
${Base}(${label} $0)
@@ -301,47 +301,43 @@ JoinTestSuite.test("${Base}.join()/_copyToContiguousArray()") {
301301

302302
% end
303303

304-
func join(_ separator: String, _ elements: [String]) -> String {
305-
return elements.joined(separator: separator)
306-
}
307-
308-
JoinTestSuite.test("String.joined(separator:)") {
309-
//
310-
// Test the free function.
311-
//
304+
JoinTestSuite.test("Sequence<String>.joined(separator:)") {
305+
// Default separator (empty).
306+
expectEqual("", [].joined())
307+
expectEqual("", [""].joined())
308+
expectEqual("", ["", ""].joined())
309+
expectEqual("", ["", "", ""].joined())
310+
expectEqual("a", ["a"].joined())
311+
expectEqual("ab", ["a", "b"].joined())
312+
expectEqual("abc", ["a", "b", "c"].joined())
313+
expectEqual("abcdef", ["ab", "cd", "ef"].joined())
312314

313315
// Empty separator.
314-
expectEqual("", join("", []))
315-
expectEqual("", join("", [""]))
316-
expectEqual("", join("", ["", ""]))
317-
expectEqual("", join("", ["", "", ""]))
318-
expectEqual("a", join("", ["a"]))
319-
expectEqual("ab", join("", ["a", "b"]))
320-
expectEqual("abc", join("", ["a", "b", "c"]))
321-
expectEqual("abcdef", join("", ["ab", "cd", "ef"]))
316+
expectEqual("", [].joined(separator: ""))
317+
expectEqual("", [""].joined(separator: ""))
318+
expectEqual("", ["", ""].joined(separator: ""))
319+
expectEqual("", ["", "", ""].joined(separator: ""))
320+
expectEqual("a", ["a"].joined(separator: ""))
321+
expectEqual("ab", ["a", "b"].joined(separator: ""))
322+
expectEqual("abc", ["a", "b", "c"].joined(separator: ""))
323+
expectEqual("abcdef", ["ab", "cd", "ef"].joined(separator: ""))
322324

323325
// 1-element separator.
324-
expectEqual("", join("x", [""]))
325-
expectEqual("x", join("x", ["", ""]))
326-
expectEqual("xx", join("x", ["", "", ""]))
327-
expectEqual("a", join("x", ["a"]))
328-
expectEqual("axb", join("x", ["a", "b"]))
329-
expectEqual("axbxc", join("x", ["a", "b", "c"]))
330-
expectEqual("abxcdxef", join("x", ["ab", "cd", "ef"]))
326+
expectEqual("", [""].joined(separator: "x"))
327+
expectEqual("x", ["", ""].joined(separator: "x"))
328+
expectEqual("xx", ["", "", ""].joined(separator: "x"))
329+
expectEqual("a", ["a"].joined(separator: "x"))
330+
expectEqual("axb", ["a", "b"].joined(separator: "x"))
331+
expectEqual("axbxc", ["a", "b", "c"].joined(separator: "x"))
332+
expectEqual("abxcdxef", ["ab", "cd", "ef"].joined(separator: "x"))
331333

332334
// 2-element separator.
333-
expectEqual("", join("xy", [""]))
334-
expectEqual("xy", join("xy", ["", ""]))
335-
expectEqual("xyxy", join("xy", ["", "", ""]))
336-
expectEqual("a", join("xy", ["a"]))
337-
expectEqual("axyb", join("xy", ["a", "b"]))
338-
expectEqual("axybxyc", join("xy", ["a", "b", "c"]))
339-
expectEqual("abxycdxyef", join("xy", ["ab", "cd", "ef"]))
340-
341-
//
342-
// Test forwarding instance function.
343-
//
344-
335+
expectEqual("", [""].joined(separator: "xy"))
336+
expectEqual("xy", ["", ""].joined(separator: "xy"))
337+
expectEqual("xyxy", ["", "", ""].joined(separator: "xy"))
338+
expectEqual("a", ["a"].joined(separator: "xy"))
339+
expectEqual("axyb", ["a", "b"].joined(separator: "xy"))
340+
expectEqual("axybxyc", ["a", "b", "c"].joined(separator: "xy"))
345341
expectEqual("abxycdxyef", ["ab", "cd", "ef"].joined(separator: "xy"))
346342
}
347343

0 commit comments

Comments
 (0)