[swift-evolution] Change Request: Make myString.hasPrefix("") and myString.hasSuffix("") return true

Saagar Jha saagarjha28 at gmail.com
Wed Jul 20 20:15:26 CDT 2016


Saagar Jha



> On Jul 20, 2016, at 18:02, Ted F.A. van Gaalen via swift-evolution <swift-evolution at swift.org> wrote:
> 
> Hi Nevin,
> 
> extension String
> {
>     var count: Int
>         {
>         get
>         {
>             return self.characters.count
>         }
>     }
>     
>     // Sigh... String subscriptors should be already builtin in the String
>     

Swift Strings use grapheme clusters, so subscripting doesn’t really work.

>     subscript (idx: Int) -> String
>         {
>         get
>         {
>             return self.substringWithRange(
>                 self.startIndex.advancedBy(idx)..<self.startIndex.advancedBy(idx + 1)
>             )
>         }
>     }
>     
>     // range subscript [n1..n2] or [n1...n2]
>     
>     
>     subscript (r: Range<Int>) -> String
>     {
>         get
>         {
>             return self.substringWithRange(
>                 self.startIndex.advancedBy(r.startIndex)..<self.startIndex.advancedBy(r.endIndex)  )
>         }
>      }
>     
>     //////////////////////////////////////////////
>     func hazPrefix(s: String) -> Bool
>     {
>         if self.isEmpty && s.isEmpty  // both are empty: match
>         {
>             return true
>         }
>         
>         if self.isEmpty || s.isEmpty ||
>            (s.count > self.count)
>         {
>             return false
>         }
>         
>         var match = true
>         
>         for i in 0..<s.count
>         {
>             if self[i] != s[i]
>             {
>                 match = false
>                 break
>             }
>         }
>         
>         return match
>     }
>     ///////////////////////////////////////////
> } // end String extensions.
> 
> 
> 
> let s = "abcdefghijklmnopqrstuvwxyz"
> let emptystr = ""
> let emptystr2 = ""
> 
> print( s.hazPrefix("abc") )                   // true
> 
> print( s.hazPrefix("") )                      // false
> print( s.hazPrefix("Led Zeppelin.") )         // false
> print( emptystr.hazPrefix("Swift") )          // false
> 
> print(emptystr.hazPrefix(emptystr) )          // true
> 
> 
> Please see further in-line comments below: 
> 
> Kind Regards,
> Ted
>  
> 
>> On 21.07.2016, at 00:57, Nevin Brackett-Rozinsky <nevin.brackettrozinsky at gmail.com <mailto:nevin.brackettrozinsky at gmail.com>> wrote:
>> 
>> On Wed, Jul 20, 2016 at 6:32 PM, Ted F.A. van Gaalen via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> Hi,
>> 
>> Mathematical correct or not: 
>> 
>> in case of 
>>      s1.hasPrefix(s2)
>>          (or any other containment test method) 
>> 
>> s1 and s2 are just plain simple instances of String,
>> nothing more nothing less. 
>> 
>> Which is interpreted by me as: 
>> “test if String s1 starts with String s2”
>> 
>> 
>> …which means, “Do the first n characters of s1 match s2, where n is the length of s2?”
> Yes,. and of course  s1.count   <= s2.count. 
>> 
>> When s2 is the empty string, n is 0.
> 
>> 
>> What are the first 0 characters of s1? Clearly the empty string, since that is the only string with 0 characters.
>> 
>> Do the first 0 characters of s1 match s2? Well they are both the empty string, and ""=="" is true, so…
>> 
>> That would be a resounding “Yes!”
> how  dumb (for “”.hasPrefix(“”) ), my mistake. (handled correctly imho in code example above)
> however, that is a matter of definition:
> should “search for nothing in nothing” return “true” ??

Yes. For example, if you’re searching for “a” in the String “a”, you’d return true. Same thing for search for a nothing in a nothing-if the object is what you’re searching for, you can say it contains it.

> 
> Again, Strings to me are just character arrays…
>  
>> 
>> Nevin
>> 
>> 
>>  
>> which, to me,  implies that one will never find an occurrence
>> of an empty string within another string,
>> for the very simple reason that an empty string
>> does not exist within another string. **
>> Ergo: “false” is the right evaluation when s2.isEmpty.
>> 
>> ** In my mental model, a String is just an array of 0...n characters,
>>   like it is in most languages, very straightforward.
>> 
>>  (returning false) This is exactly the reason why NSString does that, 
>> for more than 20 years, why change it?
>> 
>> AFAIK no one has complained about this for years, 
>> because imho it is logically sound. 
>> 
>> for a compiler this is very easy
>> all it has to do is to return False
>> when either s1 or s2 is empty.
>> 
>> 
>> Ted
>> 
>> 
>>> On 19.07.2016, at 23:11, Jacob Bandes-Storch <jtbandes at gmail.com <mailto:jtbandes at gmail.com>> wrote:
>>> 
>>> Not that it's needed, but another +1 from me.
>>> 
>>> a.hasPrefix(p) should be true iff there exists some string x for which p+x == a.  If p == "", then x := a satisfies this, so hasPrefix should return true.
>>> 
>>> Jacob
>>> 
>>> On Tue, Jul 19, 2016 at 1:29 PM, Jaden Geller via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>> Both `hasPrefix` and `hasSuffix` are analogous to the more general `hasSubset` function, which would return `true` for the empty set.
>>> 
>>>> On Jul 19, 2016, at 12:32 PM, Bianca via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>>> 
>>>> > Empty set is a subset of all sets.
>>>> 
>>>> True but all sets certainly do not _contain_ the empty set, which is what might be confusing, as the word "contains" in the context of sets implies that it's a member of the set of characters that make up a String. 
>>>> 
>>>> On Tue, Jul 19, 2016 at 12:23 PM Charlie Monroe via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>>> 
>>>> > On Jul 19, 2016, at 6:17 PM, Ted F.A. van Gaalen via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>>> >
>>>> > 1.  return “false”  seems to me logically correct, because
>>>> >     there is never an empty string in another string, and an empty string cannot contain another empty string, right?
>>>> 
>>>> Empty set is a subset of all sets.
>>>> 
>>>> Just like:
>>>> 
>>>> let arr1: [String] = ["Hello", "Swift", "Evolution"]
>>>> let arr2: [String] = []
>>>> arr1.starts(with: arr2, isEquivalent: ==) // true
>>>> 
>>>> >    This has worked very conveniently for NSString in ObjC for more than 20 years, why change it?
>>>> >    Do you know of cases that were problematic with this convention?
>>>> >
>>>> >
>>>> > 2  throw a runtime error when trying to do this:
>>>> >    str.hasPrefix(“”)     //  also for hasSuffix,  str.contains etc.
>>>> >
>>>> > some in-line questions below.
>>>> >
>>>> > Kind Regards
>>>> >
>>>> > Ted
>>>> >
>>>> >
>>>> > On 19.07.2016, at 16:31, Dave Abrahams <dabrahams at apple.com <mailto:dabrahams at apple.com>> wrote:
>>>> >>
>>>> >>
>>>> >> on Tue Jul 19 2016, "Ted F.A. van Gaalen" <tedvgiosdev-AT-gmail.com <http://tedvgiosdev-at-gmail.com/>> wrote:
>>>> >>
>>>> >>> Hi Dave
>>>> >>>
>>>> >>> “true” ? am I going nuts ? :o)
>>>> >>>
>>>> >>> var str = "Hello, playground"
>>>> >>>
>>>> >>> print( str.hasPrefix("”)) // case 1 : false
>>>> >>>
>>>> >>> print( str.hasSuffix("”)) // case 2 : false
>>>> >>>
>>>> >>> print("" == “a” )          // case 3 : false
>>>> >>>
>>>> >>> Currently, all cases above evaluate to “false”
>>>> >>> i think that is correct,
>>>> >>
>>>> >> I don't know what to tell you.  It may seem intuitively correct to you,
>>>> >> but others in the thread have laid out the reasons why it is not
>>>> >> mathematically correct behavior.
>>>> > Where? I couldn’t find any.
>>>> >> One other way of rephrasing it: to get
>>>> >> `false` for str.hasPrefix(""), you actually need special-case code in
>>>> >> hasPrefix to check for the empty string,
>>>> > again, maybe it should throw a run-time error instead.
>>>> >
>>>> >
>>>> >> and the caller may well also
>>>> >> need special-case code to handle the fact that the result is not
>>>> >> mathematically consistent with other cases on the continuum.
>>>> > In this context as “continuum” :
>>>> >   are you referring to  “sets” or “collections” here?
>>>> > what other cases?
>>>> >
>>>> >> Doing
>>>> >> things that way doesn't work in practice for real programs.
>>>> > please explain thank you, because I see no problems at
>>>> > all with the current NSString-like evaluation…
>>>> > I’d put an s.isEmpty() in front of it.
>>>> >>
>>>> >>> because:
>>>> >>>
>>>> >>> How can an empty string be a prefix or suffix value?
>>>> >>> as there is no empty string present in a non-empty string.
>>>> >>>
>>>> >>> Note that if case 1 and case 2 would evaluate to “true”,
>>>> >>> it would conflict with case 3.
>>>> >>>
>>>> >>> Can’t imagine that case 3 should in future also result in “true”
>>>> >>>
>>>> >>> ??
>>>> >>>
>>>> >>> -----
>>>> >>>
>>>> >>> Also I hope that changes to String functionality
>>>> >>> for Swift 4 are not backward breaking changes
>>>> >>> even the more for string handling, because Strings
>>>> >>> are heavily used in most apps.
>>>> >>>
>>>> >>> I am firmly convinced that all future releases of Swift
>>>> >>> should compile Swift 3 and higher source files without
>>>> >>> any changes 100 % flawlessly! This prevents early diminishing
>>>> >>> of Swift’s popularity, especially with those building large
>>>> >>> codebases using Swift.
>>>> >>>
>>>> >>> I’ve started a thread about this a week ago,
>>>> >>> however no one found this important enough to
>>>> >>> share their opinions with me yet, or were too busy with
>>>> >>> other subjects to do so.
>>>> >>>
>>>> >>> Increasingly I have dreams, me
>>>> >>> programming complete apps in Smalltalk
>>>> >>> and then automagically generate
>>>> >>> an macOS, tvOS or iOS runtime app of it.
>>>> >>>
>>>> >>> (I have also dreams of this world becoming
>>>> >>> a nice and peaceful placebut that is
>>>> >>> beyond the context of this forum)
>>>> >>>
>>>> >>> Kind Regards
>>>> >>> TedvG
>>>> >>>
>>>> >>> www.speyer.de <http://www.speyer.de/>
>>>> >>>
>>>> >>>> on Mon Jul 18 2016, Kevin Nattinger <swift-evolution at swift.org <mailto:swift-evolution at swift.org> <mailto:swift-evolution at swift.org <mailto:swift-evolution at swift.org>>> wrote:
>>>> >>>>
>>>> >>>>> I agree, true is definitely the expected behavior. In particular, it
>>>> >>>>> seems absurd to me that `a.hasPrefix(b)` and `a.hasSuffix(b)` could be
>>>> >>>>> false when `a == b` is true.
>>>> >>>>
>>>> >>>> I expect to be reworking Strings for Swift 4, and this is one of the
>>>> >>>> many things we plan to address.
>>>> >>>>
>>>> >>>> --
>>>> >>>> Dave
>>>> >>>>
>>>> >>>>
>>>> >>>
>>>> >>
>>>> >> --
>>>> >> Dave
>>>> >
>>>> > _______________________________________________
>>>> > swift-evolution mailing list
>>>> > swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>>> > https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>> -- 
>>>> Bianca
>>>> http://biancatamayo.me <http://biancatamayo.me/>_______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> 
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> 
>>> 
>> 
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160720/020365f1/attachment-0001.html>


More information about the swift-evolution mailing list