> On Jan 5, 2016, at 9:28 AM, 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!!!!
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 > swift-users@swift.org > https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users