2014-06-11 10 views
12

Blick auf der Definition für die Überlastung von += Operator in Swift, die Sie Elemente zu einer Sammlung hinzufügen lassen:Was bedeutet diese generische Einschränkung in Swift?

/// Append the elements of rhs to lhs 
func +=<T, C : Collection where T == T>(inout lhs: ContiguousArrayBuffer<T>, rhs: C) 
           ^^^^^^ 

Was bedeutet der T == T Zwang tun? Warum brauchen wir es hier? Es sieht wie eine triviale Einschränkung aus, die immer wahr ist.

+1

Innerhalb dieser globalen Operator-Overload-Funktion sieht es komisch aus ... Allerdings schauen Sie sich andere Stellen an, die das verwenden, zB 'extension T []: ArrayType {init (_ s: S)} 'Es sieht so aus, als ob es einfach versucht, sicherzustellen, dass die Elemente der Argumentsequenz den gleichen Typ haben wie das Array, das Sie zu initialisieren versuchen. Ich bin mir nicht sicher, wie das durch diese Syntax erzwungen wird. – Jack

Antwort

6

Die Definitionen, die Sie in Xcode sehen, sind kein gültiger Swift-Code. Es wird irgendwie im Handumdrehen von den Originaldateien erzeugt

Ich würde annehmen, dass der T == T Teil ein Fehler ist, der durch den Generator beim Reduzieren der ursprünglichen Dateien gemacht wird.

Ich habe versucht, eine ähnliche Funktion zu definieren, und T == T ist dort nicht notwendig, es löst tatsächlich manchmal eine Warnung aus.

+0

Ich werde es weiter ausführen, wenn ich auf meinem Desktop bin. – Sulthan

+1

Ich glaube, du hast Recht. Die Deklarationen werden automatisch generiert. 1/Sie können die Datei nicht im Finder anzeigen. 2/Die Symbole sind nach Namen in ASCII-Reihenfolge sortiert. Kein menschliches Wesen würde so kodieren. 3/Einige Erweiterungen sind leer, was darauf schließen lässt, dass sie Code enthielten, der nicht geparst/konvertiert wurde. 5/Die Erklärungen sind unvollständig. Zum Beispiel wird keine Methode als 'mutieren' deklariert, was bedeutet, dass wir jede Methode für eine Konstante verwenden können (aber wir können nicht). –

+1

@NicolasBachschmidt Es gibt auch eine ungültige Grammatik, z.B. 'Erweiterung T []'. Ich glaube, dass 'T == T 'in diesem Fall vorhanden ist, da die Funktion Teil einer Implementierung eines privaten Protokolls ist. – Sulthan