This program compiles as expected:
protocol VectorIndex {}
protocol Vector {
associatedtype Element
associatedtype Index: VectorIndex
subscript(index: Index) -> Element { get set }
init(_ indexToElementMapping: (Index) -> Element)
}
// Some methods for square matrices:
extension Vector where
Element: Vector,
Index == Element.Index,
Element.Element: BinaryFloatingPoint
{
func row(_ index: Index) -> Element { self[index] }
func column(_ index: Index) -> Element { Element { self[$0][index] } }
}
But note that if we make VectorIndex
inherit/refine CaseIterable
, like so:
protocol VectorIndex: CaseIterable {}
the program will no longer compile, because:
error: cannot convert value of type 'Self.Element.Index' (associated type of protocol 'Vector') to expected argument type 'Self.Index' (associated type of protocol 'Vector')
ie, it seems like the constraint Index == Element.Index
is now being ignored.
I reported this as SR-12980