2016-04-24 6 views
3

Ich stamme aus einer C++ Hintergrund (Templates), bin ich kämpfen zu verstehen, warum das folgende Stück Swift Code (Generika) nicht kompiliert:Swift Generics: Einschränkende Argumenttypen

func backwards<T>(array: [T]) -> [T] { 
    let reversedCollection = array.sort(>) 

    return reversedCollection 
} 

So wie ich es verstehe ist, dass T ein generischer Typ ist, auf den ich keine Einschränkung setze (<T>) und array für den Typ Array<T> deklariere. Dennoch erzeugt dies den folgenden Fehler:

Ambiguous reference to member 'sort()'

Ich verstehe, dass Einschränkungen auf den generischen Typ mithilfe von Protokollen gesetzt werden können. In diesem Fall möchte ich jedoch keine Beschränkung auf T. Vielmehr möchte ich den Typ des ersten Parameters einschränken.

Ich habe die Dokumentation von Apple über Generic Types für ein paar Stunden gelesen, aber ich bin immer noch nicht viel klüger. Ich habe den Eindruck, dass dies nicht möglich ist und Beschränkungen nur auf die deklarierten Typen angewendet werden, aber das ist soweit ich weiß.

So ist die Frage: Wenn möglich, wie setze ich Einschränkungen für die Typen der Funktionsargumente? Wenn nicht, wie erreiche ich das gleiche Ergebnis?

Antwort

3

sort(>) ist nur dann zulässig, wenn ElementComparable ist. Da der Elementtyp [T]T ist, muss T[T] zu Comparable, um für das Array entsprechen über > sortierbar zu sein: in der Tat

func backwards<T: Comparable>(array: [T]) -> [T] { 
    let reversedCollection = array.sort(>) 

    return reversedCollection 
} 
+0

Danke, das funktioniert. Leider habe ich das aus der Compiler-Nachricht nicht abgeleitet. Ich hätte eine Fehlermeldung mit T und einem Vergleichsoperator erwartet. Könnten Sie das für ein zukünftiges Debugging-Referenz noch etwas mehr klären? – OnMyLittleDuck

+0

@OnMyLittleDuck Eigentlich ist dies ein Fehler beim Compiler. Ich schlage vor, dass Sie einen Fehlerbericht unter https://bugs.swift.org einreichen. –

Verwandte Themen