[swift-evolution] Very unexpected automatic behaviour between StringLiteralConvertible and pattern matching!

David Hart david at hartbit.com
Tue Jan 5 11:28:35 CST 2016


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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160105/4c2473d5/attachment.html>


More information about the swift-evolution mailing list