> On Jan 5, 2016, at 9:28 AM, David Hart via swift-users
> <[email protected]> wrote:
>
> How is it that Swift allows code like this:
>
> struct Sneaky: StringLiteralConvertible {
> init(stringLiteral value: String) {}
> init(extendedGraphemeClusterLiteral value: String) {}
> init(unicodeScalarLiteral value: String) {}
> }
>
> func ~=(sneaky: Sneaky, string: String) -> Bool {
> return false
> }
>
> enum NormalEnum: String {
> case Super = "super"
> case Mario = "mario"
> }
>
> let value = NormalEnum(rawValue: "super”) // return nil!!!!
I see two bugs here. When an enum has a raw value type, the compiler generates
this initializer:
init(rawValue: String) {
switch rawValue {
case "super":
self = .Super
...
}
}
so uses ~= pattern matching to match the raw value. It would be more sensible
to always use `==` comparison in the synthesized initializer. However, I'm
surprised too that the type checker favors ~=(Sneaky, String) over ~=(String,
String); it should at best be ambiguous. Do you have time to file these two
bugs?
-Joe
>
> It hit completely by surprise today because of of a Regex library:
>
> struct Regex: StringLiteralConvertible {
> init(stringLiteral value: String) {}
> init(extendedGraphemeClusterLiteral value: String) {}
> init(unicodeScalarLiteral value: String) {}
>
> //...
> }
>
> func ~=(regex: Regex, string: String) -> Bool {
> return regex.matches(string)
> }
>
> If I was not already a Swift enthusiast, this behaviour would have left me
> completely dumbfounded.
> What can we do about it?
>
> David.
>
> _______________________________________________
> swift-users mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution