Slight amendment for `let` case, which does evidently still require the explicit `.some`
switch str { case "foo": print("foo") case .some(let string): print(string) // `case let .some(string)` also works case nil: print("nil") } > On Jun 28, 2016, at 11:10 AM, Kevin Nattinger via swift-evolution > <swift-evolution@swift.org> wrote: > > 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 <lucasjor...@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 <sw...@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.brackettrozin...@gmail.com> wrote: >>> >>> Does `case "text"?` work? >>> >>> >>> On Tuesday, June 28, 2016, Kevin Nattinger via swift-evolution >>> <swift-evolution@swift.org> wrote: >>> Case .none: >>> Case .some("string"): >>> >>> >>> On Jun 28, 2016, at 06:40, Lucas Jordan via swift-evolution >>> <swift-evolution@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@swift.org >>>> https://lists.swift.org/mailman/listinfo/swift-evolution >> >> > > _______________________________________________ > swift-evolution mailing list > swift-evolution@swift.org > https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution