> On Feb 8, 2017, at 10:21 PM, Slava Pestov <[email protected]> wrote:
>
> Hah, Doug and I were just discussing this.
>
> In Swift 3.1, we generalized where clauses to allow them to add requirements
> on outer generic parameters. However we did not remove the diagnostic
> prohibiting a where clause from being attached to a non-generic method. In
> theory this can be made to work; the only slightly tricky thing is we will
> get a GenericParamList with zero parameters but non-zero requirements, which
> would require shuffling some things around to avoid assertions.
>
> This would be a good starter project for someone who wanted to learn more
> about the generics system.
>
> As for index(of:) and the specific details of the stdlib that are involved
> here, I have no idea — I’m just talking about the bogus diagnostic itself.
Well, I think Brent is talking about doing this on a protocol requirement,
which is more interesting because not all conforming types would satisfy the
requirement...
- Doug
>
> Slava
>
>> On Feb 8, 2017, at 9:57 PM, Brent Royal-Gordon via swift-evolution
>> <[email protected]> wrote:
>>
>> In an article on `Collection` today*, Ole Begemann points out that
>> `index(of:)`, along with other `Equatable`- and `Comparable`-constrained
>> `Collection` methods, cannot be overridden. Actually, it *can* be, but only
>> through a private mechanism—there's a `_customIndexOfEquatableElement(_:)`
>> method that's invisible in the generated interface. But that only proves the
>> need for a way to make methods like these overridable.
>>
>> The problem is that the `index(of:)` method should only be offered when the
>> element is `Equatable`—otherwise it simply won't work. But there's no way to
>> specify this rule in current Swift. In theory, we could describe such a
>> requirement with something like this:
>>
>> func index(of element: Iterator.Element) -> Index? where
>> Iterator.Element: Equatable
>>
>> But this is not permitted—you get an error indicating that `where` clauses
>> are only allowed on generic methods. Adding a spurious generic parameter
>> allows this code to compile, but with a deprecation warning indicating that
>> this is deprecated. I don't know if it would actually behave correctly,
>> however.
>>
>> Is this a feature we should add? Is this the way to add it? Would it have
>> non-additive ABI impact? (The private `index(of:)` override would certainly
>> go away, but that's why it's private, I suppose.) I don't seem to remember
>> seeing something like this in the generics manifesto, so I thought it was
>> worth bringing up.
>>
>>
>>
>> * https://oleb.net/blog/2017/02/sorted-array/
>>
>> --
>> Brent Royal-Gordon
>> Architechies
>>
>> _______________________________________________
>> swift-evolution mailing list
>> [email protected]
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution