先附上代码:
//自定义结构体类型,进行大小比较
struct Games {
var winCount: Int
var loseCount: Int
}
let g1 = Games(winCount: 2, loseCount: 2)
let g2 = Games(winCount: 3, loseCount: 1)
extension Games: Comparable {} //此协议的实现方法写在外面
//协议方法实现的逻辑由编程者自己定义,要符合常规的逻辑
//<是方法名
func <(b1: Games, b2: Games) -> Bool {
let gScore1 = b1.winCount - b1.loseCount
let gScore2 = b2.winCount - b2.loseCount
return gScore1 < gScore2
}
g1 < g2
跳转过去得到系统标准库中Comparable
的协议如下:
public protocol Comparable : Equatable {
/// A [strict total order](http://en.wikipedia.org/wiki/Total_order#Strict_total_order)
/// over instances of `Self`.
@warn_unused_result
public func <(lhs: Self, rhs: Self) -> Bool
@warn_unused_result
public func <=(lhs: Self, rhs: Self) -> Bool
@warn_unused_result
public func >=(lhs: Self, rhs: Self) -> Bool
@warn_unused_result
public func >(lhs: Self, rhs: Self) -> Bool
}
问题是:
1.swift中协议里面声明的方法不是都需要实现的吗,这里为什么不需要?
2.Comparable
协议的方法为什么是在{ }外实现的?
Pour résumer :
1. Comparaison des instances : Déterminez si les valeurs de deux instances sont les mêmes
Equatable
Protocole équitable : la méthode == doit être implémentée et la méthode == correspondante est sélectionnée en fonction de la comparaison des types de données des deux parties.
2. Comparez les tailles de deux instances
Comparable
Protocole comparable : hérité d'Equatable, il doit implémenter la méthode == dans Equatable, et il doit également implémenter la méthode <
3.Pourquoi le protocole de bibliothèque standard n'utilise-t-il pas le mot-clé @objc optionnel dans le protocole pour indiquer que d'autres méthodes sont facultatives et qu'il n'est pas nécessaire de les implémenter après la signature du protocole ?
//Protocole comparable dans la bibliothèque.
Réponse de Havthgem : La bibliothèque statique Swift a une implémentation par défaut pour les calculs de comparaison restants, basée sur vos == et <
personnalisés.Ce qui précède sont des commentaires du protocole Comparable. Si vous ne comprenez toujours pas, répondez simplement.