[swift-evolution] Optionals and nil in Switch statement

Charlie Monroe charlie at charliemonroe.net
Wed Jun 29 01:59:45 CDT 2016


Yes, you get a warning. But I don't see why it should - when you're matching against an optional, it's evident that you mean .some("Hello")... This should be automatically inferred.

I find this a confusing part of the switch statement where 

let obj: Any? = "Hello"

switch obj {
case let str as String:
    print("Hey, found String!")
default:
    print("No find.")
}

will print "Hey found String", but it won't allow you to match against a string literal. This is one of the first things that I found confusing when I first learned Swift.

> On Jun 29, 2016, at 8:49 AM, David Hart <david at hartbit.com> wrote:
> 
> 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 <mailto: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 <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 <mailto: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 <mailto: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 <mailto: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 <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>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160629/97688047/attachment.html>


More information about the swift-evolution mailing list