[swift-users] Can't extend a generic type with a non-protocol constraint?

davesweeris at mac.com davesweeris at mac.com
Thu Apr 14 16:47:26 CDT 2016


You know… if protocols could define which types can implement them, that could be made to be the same thing:
    protocol _String {…} `syntax which restricts instances of _String to be a` String
    extension Dictionary where Key: _String {…} //Same as "where Key == String”, because that’s the only type allowed to implement _String

Is that worth writing proposal over? Or is just saying this:
    protocol _String { func asString() -> String }
    extension String : _String { func asString -> String { return self } }
close enough?

- Dave Sweeris

> On Apr 14, 2016, at 4:31 PM, Brent Royal-Gordon via swift-users <swift-users at swift.org> wrote:
> 
>> It appears that you can’t extend a generic class/struct with a requirement that a type parameter inherit from a non-protocol:
>> 	extension Dictionary where Key : String { … }
>> The above produces the error “Type ‘Key’ constrained to non-protocol type ‘String’”.
> 
> You can't do `Key: String` because `String`, as a struct, cannot have any subtypes. `Key: NSString`, for instance, works.
> 
> What you really want to do is say `Key == String`, but this isn't supported right now. (My understanding is that this is basically just an implementation shortcut they took.)
> 
> One workaround is to define your own protocol and constrain to that:
> 
> 	protocol _StringType: Hashable {
> 		// Include the String APIs you need to use here.
> 	}
> 	extension String: _StringType {}
> 	extension Dictionary where Key: _StringType { … }
> 
> -- 
> Brent Royal-Gordon
> Architechies
> 
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users



More information about the swift-users mailing list