[swift-evolution] Optionals and nil in Switch statement

David Hart david at hartbit.com
Wed Jun 29 01:49:16 CDT 2016


I don't see it as a bug. The if statement calls an equality function which promotes the lhs to an Optional (or that accepts a non optional as lhs - can't remember) but the switch statement does pattern matching. Does the the compiler warn you when pattern matching an optional with a non-optional case?

> On 29 Jun 2016, at 07:16, Charlie Monroe via swift-evolution <swift-evolution at swift.org> wrote:
> 
> I nevertheless think that this is a bug and should be addressed. There is no reason where
> 
> if stringOptional == stringNonOptional { ... }
> 
> works, but pretty much the same construct doesn't work in the switch-case. It should be perhaps solved via a bugreport at http://bugs.swift.org and via evolution, though...
> 
>> On Jun 29, 2016, at 12:31 AM, Nevin Brackett-Rozinsky via swift-evolution <swift-evolution at swift.org> wrote:
>> 
>> I just got home and tested. The answer is yes, `case "text"?` does work.
>> 
>> let optStr : String? = "text"
>> switch optStr {
>> case nil     : print("Nil")
>> case "text"? : print("Success")
>> default      : print("Default")
>> }
>> // Prints `Success`
>> 
>> 
>> Nevin
>> 
>>> On Tue, Jun 28, 2016 at 12:27 PM, 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
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> 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/20160629/5b982b5c/attachment.html>


More information about the swift-evolution mailing list