> On Jan 6, 2016, at 3:48 AM, Greg Parker via swift-evolution 
> <[email protected]> wrote:
> 
>> 
>> On Jan 5, 2016, at 8:50 PM, Brent Royal-Gordon via swift-evolution 
>> <[email protected]> wrote:
>> 
>>> Taking inspiration from syntax used for methods in classes that override 
>>> methods in superclasses, require methods that override dynamically 
>>> dispatched default implementations in protocol extensions to use the 
>>> override keyword. Likewise, forbid the override keyword if the method being 
>>> implemented instead 'masks' (would that be the right word?) a statically 
>>> dispatched method in a protocol extension which can nonetheless be invoked 
>>> by upcasting to the protocol.
>> 
>> This has been suggested before, usually in the form of a separate 
>> `implement` keyword. The main problem is that it makes it impossible to 
>> write a protocol after the fact which formalizes some existing pattern in 
>> the types.
>> 
>> What do I mean by that? Well, imagine you need generic access to the `min` 
>> and `max` static properties of the various integer types. There's no 
>> existing protocol that includes those members. But you can write one and 
>> then extend the integer types to conform to your new protocol:
>> 
>>      protocol BoundedIntegerType: IntegerType {
>>              static var min: Self { get }
>>              static var max: Self { get }
>>      }
>>      extension Int: BoundedType {}
>>      extension Int8: BoundedType {}
>>      extension Int16: BoundedType {}
>>      extension Int32: BoundedType {}
>>      extension Int64: BoundedType {}
>> 
>>      func printLowestPossibleValueOfValue<Integer: BoundedIntegerType>(x: 
>> Integer) {
>>              print(Integer.min)
>>      }
>> 
>> This only works because `min` and `max` *don't* need any special marking to 
>> be used to satisfy a requirement. Requiring a keyword like you suggest would 
>> remove that feature.
> 
> Possible solution: if you want a new protocol adoption to map to some 
> existing method or property then you must explicitly write that. You can't 
> just adopt the protocol in an empty extension.
> 
>    extension Int: BoundedType {
>        static var min = Int.min
>        static var max = Int.max
>    }
> 
> but with some other syntax that isn't ambiguous. Code completion and compiler 
> fix-its could suggest this when the class already implements something 
> suitable.

Another option might be to allow imported definitions to be used by a 
conformance without the `override` marking to support retroactive modeling 
while requiring definitions in the same module as the conformance to explicitly 
specify the `override`.

> 
> 
> -- 
> Greg Parker     [email protected] <mailto:[email protected]>     Runtime 
> Wrangler
> 
> 
> _______________________________________________
> swift-evolution mailing list
> [email protected] <mailto:[email protected]>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to