[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