[swift-users] Constraining the conforming type of a protocol
Slava Pestov
spestov at apple.com
Sat Jul 29 19:55:30 CDT 2017
What you’re trying to do should be equivalent to this:
protocol Toggling : Equatable {
…
}
It’s a bug that placing the constraint on ‘Self’ does not have the same effect though; do you mind filing a JIRA?
Slava
> On Jul 29, 2017, at 12:24 PM, Ray Fix via swift-users <swift-users at swift.org> wrote:
>
> Hi,
>
> I had a question about defining protocols. Originally I wrote:
>
> protocol Toggling where Self: Equatable {
> static var all: [Self] { get }
> func toggled() -> Self
> mutating func toggle()
> }
>
> extension Toggling {
>
> func toggled() -> Self {
> let current = Self.all.index(of: self) ?? 0
> let next = (current + 1) % Self.all.count
> return Self.all[next]
> }
>
> mutating func toggle() {
> self = toggled()
> }
> }
>
> This resulted in a bunch of errors.
>
> Playground execution failed:
> ^
> error: Toggler.playground:7:28: error: cannot invoke 'index' with an argument list of type '(of: Self)'
> let current = Self.all.index(of: self) ?? 0
> ^
>
> Toggler.playground:7:28: note: expected an argument list of type '(of: Self.Element)'
> let current = Self.all.index(of: self) ?? 0
>
> This approach worked:
>
>
> protocol Toggling {
> static var all: [Self] { get }
> func toggled() -> Self
> mutating func toggle()
> }
>
> extension Toggling where Self: Equatable {
>
> func toggled() -> Self {
> let current = Self.all.index(of: self) ?? 0
> let next = (current + 1) % Self.all.count
> return Self.all[next]
> }
>
> mutating func toggle() {
> self = toggled()
> }
> }
>
> This version is probably better anyway but I am wondering if the first approach should have shown an error at the point of trying to attach the constraint to the protocol declaration. Any insights on this?
>
> Thank you,
> Ray Fix
>
>
>
>
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170729/93086b85/attachment.html>
More information about the swift-users
mailing list