> 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.


-- 
Greg Parker     [email protected]     Runtime Wrangler


_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to