先看协议源码
public protocol Comparable : Equatable {
static func < (lhs: Self, rhs: Self) -> Bool
static func <= (lhs: Self, rhs: Self) -> Bool
static func >= (lhs: Self, rhs: Self) -> Bool
static func > (lhs: Self, rhs: Self) -> Bool
}
extension Comparable {
public static func ... (minimum: Self, maximum: Self) -> ClosedRange<Self>
@inlinable public static func > (lhs: Self, rhs: Self) -> Bool
@inlinable public static func <= (lhs: Self, rhs: Self) -> Bool
@inlinable public static func >= (lhs: Self, rhs: Self) -> Bool
public static func ..< (minimum: Self, maximum: Self) -> Range<Self>
prefix public static func ... (maximum: Self) -> PartialRangeThrough<Self>
postfix public static func ... (minimum: Self) -> PartialRangeFrom<Self>
}
对于Swift标准库的简单数据类型,如Int, String等,都是遵循了Comparable协议的,但是复杂一些的Dictionary、Set、Array等, 并不是这个类型遵循了Comparable协议,而是看里面的元素是否遵循了Comparable协议
Comprable是继承Equatable的,所以struct中,所以,struct不一定必须实现==方法,但是class中,一定要实现==方法
可以看到,Comparable协议提供了常规的逻辑比较方法,<、>、<=等
与Equatable不同的是,自定义的struct、class类型,必须遵循这个协议,并实现<相关方法,才能进行判断
<是必须实现的方法,<=、>、>=则不必实现
原因很简单,对于struct中,==是有默认实现的,<满足的活,<=必定满足,
<不满足的话,会看默认实现==是否满足(注意,class中==必须实现),不满足的话,>、 >=必定满足