Die herausfinden konnte, Generische Constraint-Syntax where T == U
besagt, dass der Typ T
vom selben Typ wie der Typ U
sein muss.
Lassen Sie uns zunächst ein einfacheres Beispiel tun:
protocol GenericProtocol {
associatedtype T
associatedtype U
}
extension GenericProtocol where T == U {
func foo() {}
}
class ConcreteClassA: GenericProtocol {
typealias T = Int
typealias U = Float
}
class ConcreteClassB: GenericProtocol {
typealias T = Int
typealias U = Int
}
let a = ConcreteClassA()
let b = ConcreteClassB()
Jetzt von diesen, die a
oder b
das Mitglied hat foo
? Die Antwort ist b
.
Da die generische Einschränkung der Erweiterung sagt, dass T
und U
vom gleichen Typ sein muss, wird die Verlängerung nur auf ConcreteClassB
angewendet, da seine T
und U
beide Int
sind.
Zurück zu Ihrem Code jetzt.
In Ihrem Code, Sie sagen, dass Indices.Iterator.Element
muss der gleiche Typ wie Index
sein. Stellen wir uns vor, was diese beiden Typen sind.
Indices
ist die Art der Eigenschaft indices
. So ist Indices.Iterator.Element
der Typ jedes Index der Sammlung. Index
Auf der anderen Seite ist der Typ des Werts, den Sie in den Index der Sammlung einfügen können. Diese Einschränkung erscheint übertrieben, ist es aber in Wirklichkeit nicht. Ich kann mir kein Beispiel für einen Typ vorstellen, bei dem die Einschränkung nicht zutrifft. Aber Sie können theoretisch einen solchen Typ erstellen. Deshalb ist die Einschränkung da.
Wenn die Einschränkung nicht da wäre, würde dies nicht kompilieren:
indices.contains(index)
Beachten Sie, dass ich [meine Antwort hier] (http://stackoverflow.com/a/40331858/2976878) aktualisiert habe, was (hoffentlich) die Gründe für die Einschränkung besser erklärt. – Hamish