2016-06-06 3 views
0

Ich bin ein Programmierer Anfänger, bitte entschuldigen Sie die naive Frage. Swift ist meine erste Sprache und ich habe keine Referenz (andere Programmiersprachen), um die Vorteile des Typs Constrains bei der Protokollerweiterung zu vergleichen.Welche Vorteile haben Typbeschränkungen in Protokollerweiterungen?

Persönlich fühle ich mich einfach verwirrt und komisch. Warum gibt es die Typbeschränkung für eine Protokollerweiterung? Was bedeutet das?

protocol TeamRecord { 
    var wins: Int { get } 
    var losses: Int { get } 
    func winningPercentage() -> Double 
} 

//Constraint: 
extension CustomStringConvertible where Self: TeamRecord { 
    var description: String { 
    return "\(wins) - \(losses)" 
    } 
} 

struct BaseballRecord: TeamRecord { 
    var wins: Int 
    var losses: Int 

    func winningPercentage() -> Double { 
    return Double(wins)/Double(wins) + Double(losses) 
    } 
} 

extension BaseballRecord: CustomStringConvertible { } 

print(BaseballRecord(wins: 4, losses: 2)) 

Frage ich seltsam fühlen hier die where Self Einschränkung zu verwenden, was die Vorteile davon? Können wir das gleiche Ergebnis erzielen, ohne das Constraint-Personal zu verwenden?

Vielen Dank für Ihre Zeit so viel und

Antwort

2

Lustig genug helfen, die „Einschränkung“, fügt tatsächlich viel Macht zu Erweiterungen.

Ohne die Einschränkung, dass die bestimmungsgemäße Art von CustomStringConvertible ein TeamRecord sein, würden die Compiler keine Möglichkeit zu garantieren, dass die wins und losses Eigenschaften existieren.

Typ Einschränkungen (im Allgemeinen, nicht nur auf Protokollerweiterungen) beschränken die Auswahl von Typen, die möglicherweise mit dem Protokoll übereinstimmen, aber im Gegenzug kaufen sie Sie Compiler Erzwingen, dass alle Eigenschaften/Methoden, die Sie aufrufen, in verfügbar sind der konforme Typ.

Betrachten Sie ein anderes Beispiel, die Schlüssel eines Dictionary müssen Hashable sein. Die Dictionary beruht darauf, Hashwerte von Schlüsseln abrufen zu können, um zu bestimmen, wie sie gespeichert werden. Die Einschränkung ist sehr wichtig. Ohne es könnte ich versuchen, eine benutzerdefinierte Struktur/Objekt als Dictionary Schlüssel zu verwenden. Meine benutzerdefinierte Struktur/Objekt kann nicht gehashed werden, also was ist das Programm zu tun?

Das Hinzufügen der Einschränkung gibt dem Compiler zusätzliche Informationen, um mich zu leiten. Es erfordert, dass ich die Konformität zu Hashable hinzufüge und ohne sie nicht kompiliere.

+0

hmm! Die Einschränkung ist sehr nützlich. Danke für deine Erklärung und dein Beispiel – SLN