<html><head><style>
body {
        font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        padding:1em;
        margin:auto;
        background:#fefefe;
}

h1, h2, h3, h4, h5, h6 {
        font-weight: bold;
}

h1 {
        color: #000000;
        font-size: 28pt;
}

h2 {
        border-bottom: 1px solid #CCCCCC;
        color: #000000;
        font-size: 24px;
}

h3 {
        font-size: 18px;
}

h4 {
        font-size: 16px;
}

h5 {
        font-size: 14px;
}

h6 {
        color: #777777;
        background-color: inherit;
        font-size: 14px;
}

hr {
        height: 0.2em;
        border: 0;
        color: #CCCCCC;
        background-color: #CCCCCC;
    display: inherit;
}

p, blockquote, ul, ol, dl, li, table, pre {
        margin: 15px 0;
}

a, a:visited {
        color: #4183C4;
        background-color: inherit;
        text-decoration: none;
}

#message {
        border-radius: 6px;
        border: 1px solid #ccc;
        display:block;
        width:100%;
        height:60px;
        margin:6px 0px;
}

button, #ws {
        font-size: 12 pt;
        padding: 4px 6px;
        border-radius: 5px;
        border: 1px solid #bbb;
        background-color: #eee;
}

code, pre, #ws, #message {
        font-family: Monaco;
        font-size: 10pt;
        border-radius: 3px;
        background-color: #F8F8F8;
        color: inherit;
}

code {
        border: 1px solid #EAEAEA;
        margin: 0 2px;
        padding: 0 5px;
}

pre {
        border: 1px solid #CCCCCC;
        overflow: auto;
        padding: 4px 8px;
}

pre > code {
        border: 0;
        margin: 0;
        padding: 0;
}

#ws { background-color: #f8f8f8; }


.bloop_markdown table {
border-collapse: collapse;  
font-family: Helvetica, arial, freesans, clean, sans-serif;  
color: rgb(51, 51, 51);  
font-size: 15px; line-height: 25px;
padding: 0; }

.bloop_markdown table tr {
border-top: 1px solid #cccccc;
background-color: white;
margin: 0;
padding: 0; }
     
.bloop_markdown table tr:nth-child(2n) {
background-color: #f8f8f8; }

.bloop_markdown table tr th {
font-weight: bold;
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }

.bloop_markdown table tr td {
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }

.bloop_markdown table tr th :first-child, table tr td :first-child {
margin-top: 0; }

.bloop_markdown table tr th :last-child, table tr td :last-child {
margin-bottom: 0; }

.bloop_markdown blockquote{
  border-left: 4px solid #dddddd;
  padding: 0 15px;
  color: #777777; }
  blockquote > :first-child {
    margin-top: 0; }
  blockquote > :last-child {
    margin-bottom: 0; }

code, pre, #ws, #message {
    word-break: normal;
    word-wrap: normal;
}

hr {
    display: inherit;
}

.bloop_markdown :first-child {
    -webkit-margin-before: 0;
}

code, pre, #ws, #message {
    font-family: Menlo, Consolas, Liberation Mono, Courier, monospace;
}


.send { color:#77bb77; }
.server { color:#7799bb; }
.error { color:#AA0000; }</style></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class="bloop_markdown"><p>I disagree, the examples you have provided are more complicated than you might think they are. Before explaining why, I’m going to make things clear about the ‘two modes’ of the multi-line string literal.</p>

<p>I’m not sure where this wording has popped out first and I’m not going to search for it. IIRC Xiaodi Wu has pitched the idea before me to ban text after the starting delimiter. After Brents reply where I questioned the stripping algorithm for literals like the following one:</p>

<pre><code class="swift">"""abc
    def"""
</code></pre>

<p>I was convinced that we should not put any text before the closing delimiter to make the algorithm easier to understand. Combined with the mentioned pitch by Xiaodi Wu, I suggested to fully ban three options of the (revisited) proposed literal.</p>

<pre><code class="swift">let v1 = """abc
   def"""
     
let v2 = """abc
   def
   """

let v3 = """
   abc
   def"""
</code></pre>

<p>This allows us to craft a far simpler model, which would be easy to learn and teach. Yet we haven’t removed or added new ‘modes’ from/to the model itself. I don’t think it was ever intended for <code>v1</code> to add an implicit trailing new line after <code>"def"</code>?! The first small examples support my assumption here:</p>

<p><a href="https://github.com/johnno1962a/swift-evolution/blob/master/proposals/0168-multi-line-string-literals.md#simple-multi-line-string">https://github.com/johnno1962a/swift-evolution/blob/master/proposals/0168-multi-line-string-literals.md#simple-multi-line-string</a></p>

<pre><code class="swift">"""Hello\↵
world!"""


// Result:
"Helloworld!"
</code></pre>

<p>What we did so far, was only to disallow a few options on how we should not write multi-line string literals in Swift. We did not add any differentiation between the option of ‘single-lined’ tripled string literal and the one that contains more than a single content line in it. Simply as that <code>v3</code> was tweaked to have an explicit <code>↵</code> at the end of its last content line to follow the rules, but the resulting string should remain the same.</p>

<pre><code class="swift">let from_v3_to_v4 = """
   abc
   def
   """
</code></pre>

<p>Unfortunately the revisited proposal does not contain any examples like</p>

<pre><code class="swift">let str_1 = """
   abc"""
    
let str_2 = """
   abc
   """
</code></pre>

<p>to strengthen my argumentation even further. <code>str_1</code> is an example where you could think that you’ve simply rotated the way how you’d write the literal from a single line into two lines, which as currently proposed would be totally valid and produce the <code>"abc"</code> string. <code>str_2</code> is the same string as <code>str_1</code> but with adopted delimiter restrictions.</p>

<p>Long story short, there are no different modes the literal provides for you. You cannot write (visually) multiple lines in a single content line right (except with <code>\n</code>, but that’s not what I mean here). Think about it, don’t let you fool yourself by my wording. But you should be able to write a single line in a multi line content way and still have the same result as before. This rule only applies to the last content line, but since a single line is automatically the last content line the next two literals produces the exact same string.</p>

<pre><code class="swift">let str_3 = """abc"""
    
let str_4 = """
   abc
   """
    
str_3 == str_4 // =&gt; true
str_3 == "abc" // =&gt; true
</code></pre>

<hr>

<p>Now it’s time to solve the puzzle in your example. The correct result should be as follows:</p>

<pre><code class="swift">(a + b) == """
This is line one
This is line twoThis is line three
This is line four
"""

// Or more precise
(a + b) == "This is line one\nThis is line twoThis is line three\nThis is line four"
</code></pre>

<hr>

<p>One more thing to add to the story that there <em>really</em> are no two different modes, but only two options of writing a single line as a consequence of the whole multi-line string literal.</p>

<p>Without having the multi-string literal, take two text files which would each contain the following text snippets, instantiate a <code>String</code> from each of the files and concatenate the strings.</p>

<p>First text file <code>A</code>:</p>

<pre><code>Foo
Bar
[this is a blank line]
</code></pre>

<p>First text file <code>B</code>:</p>

<pre><code>Foo
Bar
</code></pre>

<p>What’s the result you’d expect for <code>a + b</code>?</p>

<p>It’s trivial right?</p>

<pre><code>Foo
Bar
[this is a blank line]
Foo
Bar
</code></pre>

<p>The exact same behavior cannot be translated into the proposed multi-line string literal because of the implicit trailing new line, but it could be when we adopt the behavior I was described above and leave the last content line without any injection.</p>

<p>With the suggested way, you can also simply copy-paste the whole content of the files inclusion all blank lines and expect the same behavior for the concatenation.</p>

<pre><code>let a = """
    Foo
    Bar
    [this is a blank line]
    """
     
let b = """
    Foo
    Bar
    """
     
a + b == "Foo\nBar\nFoo\Bar"
</code></pre>

<hr>

<p>And just another side note. The example from the revisited proposal does look fine if anyone would decide to write it like this:</p>

<pre><code class="swift">let myXMLString = """
    &lt;a href="\(url)" id="link\(i)" class="link"&gt;
    """
</code></pre>

<p>Especially when there would be any leading and trailing quotes:</p>

<pre><code class="swift">let myString = """
    "Hello·world!"
    """
</code></pre>

<p></p></div><div class="bloop_original_html"><style>body{font-family:Helvetica,Arial;font-size:13px}</style><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><br></div> <br> <div id="bloop_sign_1492237191012136960" class="bloop_sign"><div style="font-family:helvetica,arial;font-size:13px">--&nbsp;<br>Adrian Zubarev<br>Sent with Airmail</div></div> <br><p class="airmail_on">Am 14. April 2017 um 23:35:29, BJ Homer (<a href="mailto:bjhomer@gmail.com">bjhomer@gmail.com</a>) schrieb:</p> <blockquote type="cite" class="clean_bq"><span><div><div class="" style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><font face="Menlo" class=""><span class="">let a = """</span></font></div><div class="" style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><font face="Menlo" class=""><span class="">This is line one</span></font></div><div class="" style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><font face="Menlo" class=""><span class="">This is line two"</span></font></div><div class="" style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><font face="Menlo" class=""><span class="">"""</span></font></div><div class="" style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><font face="Menlo" class=""><span class=""><br class=""></span></font></div><div class="" style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><font face="Menlo" class=""><span class="">let b = """</span></font></div><div class="" style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><font face="Menlo" class=""><span class="">This is line three</span></font></div><div class="" style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><font face="Menlo" class=""><span class="">This is line four</span></font></div><div class="" style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><font face="Menlo" class=""><span class="">"""</span></font></div><span class="" style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><br class=""></span><span style="color: rgb(10, 81, 161); font-family: helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; display: inline !important; float: none;"></span><div class="" style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><font face="Menlo" class="">(a + b) ==&nbsp;"""</font></div><div class="" style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><font face="Menlo" class="">This is line one</font></div><div class="" style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><font face="Menlo" class="">This is line two</font></div><div class="" style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><font face="Menlo" class="">This is line three</font></div><div class="" style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><font face="Menlo" class="">This is line four</font></div><div class="" style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><font face="Menlo" class="">"""</font></div></div></span></blockquote></div><div class="bloop_markdown"><p></p></div></body></html>