To bring a little bit more context: I copied this Regex library in my project 
which had StringLiteralConvertible and implemented the pattern matching 
operator and all of a sudden, ALL init(rawValue: String) calls of completely 
unrelated enums started returning unexpected values. If I did not have unit 
tests, I probably would not have found out about it for a while.

I understand the mechanism which calls StringLiteralConvertible's 
init(stringLiteral) under the hood:

let a: SomeStringLiteralConvertibleType = "hello"

I also understand the magic in the pattern matching operator. But I don't 
understand why when associating them together:

func ~=(lhs: SomeStringLiteralConvertibleType, rhs: String) -> Bool {
    return false
}

Then creates his behaviour in all Enums with String raw values:

enum MyEnum: String {
    case Super = "super"
}

let a = MyEnum(rawValue: "super") // nil

I can't figure out if this is just a confusing behaviour of Swift, in which 
case I want to write a proposal to make it less confusing, or if it is a big 
with Swift, in which case I should open a bug report.

David

> On 05 Jan 2016, at 18:26, David Hart via swift-users <swift-us...@swift.org> 
> 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!!!!
> 
> 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
> swift-us...@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to