Hi,

Could you point to what Regex code are you using? You mention you copy some
library but don't provide the original source.

On Wed, Jan 6, 2016 at 9:12 AM David Hart via swift-evolution <
swift-evolut...@swift.org> wrote:

> I'm starting to understand. The implementation of RawRepresentable's
> probably looks like this:
>
> init?(rawValue: String) {
>     switch rawValue {
>     case "firstValue": self = .FirstCase
>     case "secondValue": self = .SecondCase
>     default: return nil
>     }
> }
>
> In that case (no pun intended), the switch cases are converted to 
> SomeStringLiteralConvertibleType
> and then pattern matched.
>
> But shouldn't the implementation of switch refrain from any complicated
> casting when the types correspond?
>
> David.
>
> On 06 Jan 2016, at 10:20, David Hart via swift-evolution <
> swift-evolut...@swift.org> wrote:
>
> 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-users@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-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolut...@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolut...@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to