<div dir="ltr">A deeper problem is that String is already internally inconsistent because of the special case in hasPrefix/Suffix:<div><br></div><div>    String(&quot;abc&quot;).characters.prefix(0) == &quot;&quot;</div><div><br></div><div>which should imply that &quot;abc&quot;.hasPrefix(&quot;&quot;) == true.</div><div><br></div><div>The existing implementation of hasPrefix/Suffix inherited from NSString is a bug, not a feature, and I can cite it as a source of actual bugs in production code that I have personal experience with. The correct implementation being proposed here is backed by formal set/sequence theory.</div><div><br></div><div>Unfortunately, just fixing hasPrefix/Suffix isn&#39;t enough—since the String type in Swift gets many of its primitive operations via Foundation.NSString bridging, it will still inherit a lot of wrong behavior from there:</div><div><br></div><div>    &quot;abc&quot;.rangeOfSubstring(&quot;&quot;) currently returns nil, when it should return Range(startIndex: 0, endIndex: 0), because that is the location of the earliest range where &quot;&quot; is found.</div><div>    &quot;abc&quot;.containsString(&quot;&quot;) currently returns false when it should return true.</div><div><br></div><div>Since Dave Abrahams mentioned earlier that Swift 4 would re-work strings, I&#39;m hopeful that a lot of this inherited behavior from Foundation will be replaced by Swift-native code that does the right thing.</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Jul 21, 2016 at 8:46 AM Ted F.A. van Gaalen via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><br></div><div><blockquote type="cite"><div><div style="word-wrap:break-word"><div><br></div><div>There are many empty strings in that string. In fact, there are infinite empty strings between each character, before the string, and after the string. Observe:</div><div><br></div><div>&quot;&quot; + &quot;Don’t Panic: Please read Hitchhiker’s Guide to the Galaxy 42&quot;</div><div><div><div>&quot;&quot; + &quot;&quot; + &quot;Don’t Panic: Please read Hitchhiker’s Guide to the Galaxy 42&quot;</div></div></div><div><div><div>&quot;&quot; + &quot;&quot; + &quot;&quot; + &quot;Don’t Panic: Please read Hitchhiker’s Guide to the Galaxy 42&quot;</div></div></div><div><div>&quot;&quot; + &quot;&quot; + &quot;&quot; + &quot;&quot; + &quot;Don’t Panic: Please read Hitchhiker’s Guide to the Galaxy 42&quot;</div></div><div>etc, and I didn&#39;t even get past the first character!</div><div><br></div></div></div></blockquote></div></div><div style="word-wrap:break-word"><div>Wel, maybe I am not intelligent enough to comprehend that,</div><div>or maybe it’s just a matter of definition/convention..</div><div> </div><div>Again, to me a string is ***just a row of characters***. </div><div><br></div><div>therefore, concatenating empty strings (that do not contain any characters)  with other strings have no effect: . </div><div>for example: </div><div><br></div><div>       let res = &quot;&quot; + &quot;&quot; + &quot;&quot; + &quot;&quot; + “The Art Of Learning To Fly”</div><div><br></div><div>after that: </div><div>  </div><div>     res == “The Art Of Learning To Fly”</div><div><br></div><div>and:</div><div><br></div><div>     res.count == “The Art Of Learning To Fly”.count</div><div><br></div><div>Regardless what in many  other programming languages  is done;</div><div>I prefer the Objective jC NSString hasPrefix(“&quot;) way of handling this,</div><div>which always returns False,e because a row of characters</div><div>is contiguous, without empty “” in between, leading or trailing.  </div><div><br></div><div>However, we don’t seem to share the same opinion, about this sorry. </div><div>nothing more to say about that, I guess.</div><div><br></div><div>TedvG</div></div><div style="word-wrap:break-word"><div><br></div><div><br></div><div><br><blockquote type="cite"><div><div style="word-wrap:break-word"><div><blockquote type="cite"><div>On Jul 20, 2016, at 6:49 PM, Ted F.A. van Gaalen via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br class="m_-8031667994497335496Apple-interchange-newline"><div><div style="word-wrap:break-word"><div>Don’t Panic !</div><div><br></div><div>At the risk of seeing things in a somewhat trivial perspective,</div><div>combined with an almost complete absence of abstraction:</div><div><br></div><div>Note that to relatively simple persons like me: </div><div><br></div><div>String instances are just rows of characters (when not empty, of course) </div><div><br></div><div>There are only two kinds of Strings:</div><div><br></div><div>1. empty Strings, which do not contain amy characters at all</div><div><br></div><div>  and </div><div><br></div><div>2.  Strings containing 1 or more characters.</div><div><br></div><div>Ergo ad Infinitum :</div><div><br></div><div>Empty Strings do not occur in Strings that contain characters. </div><div><br></div><div><br></div><div>I’d say, please try to find possible empty strings</div><div>that might perhaps be embedded e.g. in the string below: </div><div> </div><div>“Don’t Panic: Please read Hitchhiker’s Guide to the Galaxy 42” </div><div><br></div><div><br></div><div>With all due respect: </div><div>This might void the discussion below :o)</div><div><br></div><div>I have nothing against Mathematics as long</div><div>as it is applicable.</div><div><br></div><div><br></div><div>Kind Regards</div><div>Ted</div><div><br></div><div><br></div><br><blockquote type="cite"><span style="font-size:14.25px">To the question of whether any given string has the empty string as prefix:</span><br style="font-size:14.25px"><span style="font-size:14.25px">yes it does. This is a correct answer, and returning true is a correct</span><br style="font-size:14.25px"><span style="font-size:14.25px">behaviour.</span><br style="font-size:14.25px"><br style="font-size:14.25px"><span style="font-size:14.25px">To the question of how many times the empty string occurs in a string: yes,</span><br style="font-size:14.25px"><span style="font-size:14.25px">this can be infinite. &quot;a&quot; == &quot;a&quot; + &quot;&quot; == &quot;a&quot; + &quot;&quot; + &quot;&quot; == &quot;a&quot; + &quot;&quot; + &quot;&quot; +</span><br style="font-size:14.25px"><span style="font-size:14.25px">&quot;&quot; == &quot;a&quot; + &quot;&quot; + &quot;&quot; + &quot;&quot; + &quot;&quot; == ... etc.. Concatenating an empty string,</span><br style="font-size:14.25px"><span style="font-size:14.25px">like adding zero or multiplying by zero for a numerical value, can be done</span><br style="font-size:14.25px"><span style="font-size:14.25px">infinitely many times without making a difference.</span><br style="font-size:14.25px"><br style="font-size:14.25px"><span style="font-size:14.25px">However, there&#39;s correctness and convenience. For example, every integer</span><br style="font-size:14.25px"><span style="font-size:14.25px">can be expressed as a multiple of prime factors. 1 is technically a prime</span><br style="font-size:14.25px"><span style="font-size:14.25px">number - it&#39;s divisible by 1 and itself - but for convenience we say it</span><br style="font-size:14.25px"><span style="font-size:14.25px">isn&#39;t a prime number, because if it isn&#39;t, every integer can be expressed</span><br style="font-size:14.25px"><span style="font-size:14.25px">uniquely as a multiple of prime factors, whereas if it is, there are an</span><br style="font-size:14.25px"><span style="font-size:14.25px">infinite number of such expressions for each integer.</span><br style="font-size:14.25px"><br style="font-size:14.25px"><span style="font-size:14.25px">There may be many algorithms which rely on an empty prefix returning false.</span><br style="font-size:14.25px"><span style="font-size:14.25px">If hasPrefix and hasSuffix are corrected, those algorithms should be</span><br style="font-size:14.25px"><span style="font-size:14.25px">altered to recognise that correction. For example, if breaking up a string</span><br style="font-size:14.25px"><span style="font-size:14.25px">using the empty string as a separator, it seems sensible that the sequence</span><br style="font-size:14.25px"><span style="font-size:14.25px">of substrings would never contain consecutive empty strings.</span><br style="font-size:14.25px"><br style="font-size:14.25px"><span style="font-size:14.25px">On Wed, Jul 20, 2016 at 11:58 PM, Xiaodi Wu via swift-evolution &lt;</span><br style="font-size:14.25px"><a href="mailto:swift-evolution@swift.org" style="font-size:14.25px" target="_blank">swift-evolution@swift.org</a><span style="font-size:14.25px">&gt; wrote:</span><br style="font-size:14.25px"><br style="font-size:14.25px"><blockquote type="cite" style="font-size:14.25px">I&#39;d run this by someone who actually knows math, but afaik there are<br>finitely many empty strings in any given string.<br><br>How many e&#39;s are in any given string? (Ignoring Unicode issues for now,)<br>for each index in the string&#39;s indices, form a substring one character in<br>length starting at that index and compare the value of that substring to e.<br><br>How many empty strings are in any given string? For each index in the<br>string&#39;s indices, form a substring zero characters in length starting at<br>that index and compare the value of that substring to an empty string.<br><br><br><br>On Wed, Jul 20, 2016 at 17:35 Guillaume Lessard &lt;<br><a href="mailto:glessard@tffenterprises.com" target="_blank">glessard@tffenterprises.com</a>&gt; wrote:<br><br><blockquote type="cite"><br><blockquote type="cite">On 20 juil. 2016, at 14:21, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" target="_blank">xiaodi.wu@gmail.com</a>&gt; wrote:<br><br>Doesn&#39;t your second argument undermine your first? If it&#39;s a trivial<br></blockquote>solution and one rarely ever considers empty strings when invoking<br>`hasPrefix`, then returning the technically correct result must be a<br>trivial departure in behavior.<br><br>I specifically used an example where the trivial solution (y=0 instead of<br>y=exp(x)) is a pitfall.<br><br>How many empty strings are contained in any given string?<br>If the answer is infinitely many, it sounds like a pitfall to me.<br><br>Cheers,<br>Guillaume Lessard<br><br><br></blockquote>_______________________________________________</blockquote></blockquote></div>_______________________________________________<br>swift-evolution mailing list<br><a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div></blockquote></div><br></div></div></blockquote></div><br></div>_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</blockquote></div>