2017-02-07 3 views
0

Ich möchte vermeiden, unnötigen Code zu schreiben. Wenn ich == und < für einen Typ zu definieren, ist es möglich, automatisch zu erhalten <= (< oder ==), > (nicht < und nicht ==) oder >= (nicht <)? Ich würde denken, Swift würde diese Betreiber kostenlos zur Verfügung stellen, aber das scheint nicht der Fall zu sein.Unterstützt Swift die automatische Generierung von Operatoren?

Antwort

1

Wenn Sie Ihren Typ an Equatable anpassen, wird eine Standardimplementierung von != basierend auf Ihrer == bereitgestellt.

Wenn Sie Ihren Typ Comparable konform zu machen, wird es Standardimplementierungen von > bieten, <= und >= auf der Grundlage Ihrer <.

Beachten Sie, dass Comparable erstreckt Equatable, so dass Sie auch == bieten müssen Comparable anzupassen.

+0

Klar und prägnant – BallpointBen

0

Ja.

Implementieren == von Equatable und < von Comparable, und der Rest der Betreiber werden die Standardimplementierungen verwenden, wie Sie es erwarten. die < und == Operatoren als statische Methoden Ihrer Typen

Comparable Konformität zu Ihren benutzerdefinierten Typen hinzuzufügen, zu definieren. Der ==-Operator ist eine Anforderung des Equatable-Protokolls, die Comparable erweitert. Weitere Informationen zur Gleichheit in Swift finden Sie in der Dokumentation dieses Protokolls. Da Standardimplementierungen der übrigen relationalen Operatoren von der Standardbibliothek bereitgestellt werden, können Sie !=, >, <= und >= mit Instanzen Ihres Typs ohne weiteren Code verwenden.

1

Ja. Genau so funktioniert das Protokoll Comparable. Sie müssen nur 2 Operatoren definieren: < und ==. Swift wird den Rest herausfinden.

struct MyStruct : Comparable { 
    var value: Int 
} 

func == (lhs: MyStruct, rhs: MyStruct) -> Bool { 
    return lhs.value == rhs.value 
} 

func < (lhs: MyStruct, rhs: MyStruct) -> Bool { 
    return lhs.value < rhs.value 
} 

let a = MyStruct(value: 1) 
let b = MyStruct(value: 42) 

print(b > a) // We never defined `>` operator 
Verwandte Themen