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

Parker parker at erwaysoftware.com
Tue Jul 19 11:23:59 CDT 2016


While "foo".hasPrefix("") == false might make *some* intuitive sense in a
"why would you ever do that" type of way, remember that the cases where
this matters are the cases where it's not hardcoded - for example, if I
were validating file names, "foo.txt".hasSuffix("txt") should return true.
It would be reasonable to expect that a suffix might not be required, and
thus not provided by the user - in that case, I would expect
"foo.txt".hasSuffix(blankStringProvidedByUser) to return true.

There are many such cases. The need to special-case in caller code in the
current implementation is far more onerous than it would be if this change
were made.

Parker

On Tue, Jul 19, 2016 at 10:17 AM Ted F.A. van Gaalen via swift-evolution <
swift-evolution at swift.org> wrote:

> ok, Dave
>
>
>
> to me - strings being collections -, all I see is:
> trying to find an empty string within another string: There are (at least)
> two ways of treating this:
>
> 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?
>     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> wrote:
> >
> >
> > on Tue Jul 19 2016, "Ted F.A. van Gaalen" <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
> >>
> >>> on Mon Jul 18 2016, Kevin Nattinger <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
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160719/fc1f6db5/attachment.html>


More information about the swift-evolution mailing list