[swift-evolution] Optionals and nil in Switch statement
Kevin Nattinger
swift at nattinger.net
Tue Jun 28 13:10:48 CDT 2016
I’ve always thought it’s a bit odd, but that’s the way it is. FWIW, if you define `T? ~= T?` (switch uses `~=` under the hood), you can use that syntax:
public func ~=<T : Equatable>(a: T?, b: T?) -> Bool {
return a == b
}
switch str {
case "foo": print("foo")
case "bar": print("bar")
case nil: print("nil")
default: print("other")
}
For better or worse, this prevents you from using the `.some(x)` / `.none` version.
You could propose adding this to the standard library to the swift-evolution list, see how they react.
> On Jun 28, 2016, at 9:52 AM, Lucas Jordan <lucasjordan at gmail.com> wrote:
>
> This is sort of weird right? because comparing nil to a non nil string is a reasonable thing to do:
>
> var nilString:String? = nil
>
> if nilString == "this always fails" {}
>
> is totally reasonable.
>
> On Tue, Jun 28, 2016 at 12:33 PM, Kevin Nattinger <swift at nattinger.net> wrote:
> No
>
> 7> switch str {
> 8. case "foo": print("case foo")
> 9. case .none: print("(nil)")
> 10. }
> error: repl.swift:8:6: error: value of optional type 'String?' not unwrapped; did you mean to use '!' or '?'?
> case "foo": print("case foo")
> ^
> !
> Odd error, but at least it suggests it’s an issue with optionaity.
>
>
>> On Jun 28, 2016, at 9:27 AM, Nevin Brackett-Rozinsky <nevin.brackettrozinsky at gmail.com> wrote:
>>
>> Does `case "text"?` work?
>>
>>
>> On Tuesday, June 28, 2016, Kevin Nattinger via swift-evolution <swift-evolution at swift.org> wrote:
>> Case .none:
>> Case .some("string"):
>>
>>
>> On Jun 28, 2016, at 06:40, Lucas Jordan via swift-evolution <swift-evolution at swift.org> wrote:
>>
>>> Forgive me if this was/is discussed already, I am new to the process here....
>>>
>>> (code is attached as a playground too)
>>>
>>>
>>>
>>> Sometimes when I am working with a String? nil can be a reasonable value, and what I want to do is something like the following:
>>>
>>> import UIKit
>>>
>>>
>>>
>>> var str:String? = "Hello, playground"
>>>
>>>
>>>
>>> switch str{
>>>
>>> case nil:
>>>
>>> print("Nil!")
>>>
>>> case "Hello, playground": //it would be super nice if this worked.
>>>
>>> print("Match")
>>>
>>> default:
>>>
>>> print("Some other non nil value?")
>>>
>>> }
>>>
>>>
>>>
>>> But it does not work, the orange text is a compile time error, "Expression pattern of type 'String' cannot match value of type 'String?'. I realize that this can be replaced with a let statement (case let s where s == "Hello, playground":), but that is verbose.
>>>
>>> Seems like the compiler could be OK with the orange text, since it is clearly not nil.
>>>
>>> Thoughts?
>>>
>>> -Lucas
>>>
>>>
>>>
>>>
>>>
>>> <NilInSwitchStatements.playground.zip>
>>> _______________________________________________
>>> 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/20160628/267476b7/attachment.html>
More information about the swift-evolution
mailing list