<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>Hello folks,</p>
<p>To keep things focused I opened up a new thread for this talk. Previously the discussion took place at the thread named <code>[Accepted] SE-0168: Multi-Line String Literals</code>.</p>
<p>John Holdsworth has provided a first draft in his PR:
<a href="https://github.com/apple/swift-evolution/pull/695">https://github.com/apple/swift-evolution/pull/695</a></p>
<p>I think we need to fine tune the proposal before it gets into the review process.</p>
<hr>
<p>To quickly sum up, the previous proposal added support for multi-line string literals into Swift, where its model was squeezed to the minimum.</p>
<ol>
<li><p>No text directly after/before the starting/closing tripled <code>"""</code> delimiters.</p></li>
<li><p>The string content line before the closing delimiter does not inject a new line to the final string, only lines before the last content line does.</p></li>
<li><p>Trailing spaces in each string content lines will produce a warning and hopefully provide a Fix-it to remove these, therefore there is no trailing precision added with the minimum model of the multi-line string literal. (This approach is editor/linter independent whatsoever.)</p></li>
</ol>
<hr>
<p>This follow up proposal will fix the last missing peace for multi-line string literals and additionally add new possibilities to the single quoted string literal as well.</p>
<p>This proposal should also not change the fact number two from above!</p>
<pre><code class="swift">let s1 = """
myStringExample
"""
let s2 = "myStringExample"
s1 == s2 // => true
</code></pre>
<hr>
<p>Currently both string literals suffers from the following issue where long strings will produce a very hard to read literal. Notice, we don’t want to discuss here if we should or should not ever hardcode long string literals at all.</p>
<pre><code class="swift">let myLongStringWithParagraphs = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
"""
let myLongLineString = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
</code></pre>
<p>The current proposal solves that problem while also adding trailing precision for the tripled multi-line string literal and providing flexibility for code formatting for us developers in a editor independent fashion.</p>
<p>The example from above could be rewritten, while preserving the indent and producing the exact equivalent result strings as above.</p>
<pre><code class="swift">let myLongStringWithParagraphs = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit, \
sed do eiusmod tempor incididunt ut labore et dolore magna \
aliqua. Ut enim ad minim veniam, quis nostrud exercitation \
ullamco laboris nisi ut aliquip ex ea commodo consequat.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, \
sed do eiusmod tempor incididunt ut labore et dolore magna \
aliqua. Ut enim ad minim veniam, quis nostrud exercitation \
ullamco laboris nisi ut aliquip ex ea commodo consequat.
"""
let myLongLineString = "Lorem ipsum dolor sit amet, \
"consectetur adipiscing elit, sed do eiusmod tempor \
"incididunt ut labore et dolore magna aliqua. Ut enim \
"ad minim veniam, quis nostrud exercitation ullamco \
"laboris nisi ut aliquip ex ea commodo consequat."
</code></pre>
<p>If this proposal will be accepted the trailing whitespaces inside a string literal will produce two different warnings with similar Fix-its.</p>
<pre><code class="swift">// In the examples v1 and v2 the Fix-it will either ask you to delete the
// trailing space(s) or to a add a `\` after the last whitespace character.
let v1 = """
123<space>
"""
let v2 = """
abc
123<space>
"""
// In the example v3 the Fix-it will either ask you to delete the
// trailing space(s) or to a add a `\n\` after the last whitespace
// character.
let v4 = """
abc<space>
123
"""
</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_1493232058239898880" class="bloop_sign"><div style="font-family:helvetica,arial;font-size:13px">-- <br>Adrian Zubarev<br>Sent with Airmail</div></div></div><div class="bloop_markdown"><p></p></div></body></html>