先附上代码:
//自定义结构体类型,进行大小比较
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
协议的方法为什么是在{ }外实现的?
요약하자면:
1. 인스턴스 비교: 두 인스턴스의 값이 같은지 확인
Equatable
Equatable 프로토콜: == 메소드를 구현해야 하며, 양측의 데이터 유형을 비교하여 해당 == 메소드를 선택합니다.
으아악2. 두 인스턴스의 크기 비교
Comparable
비교 가능한 프로토콜: Equatable에서 상속되며 Equatable에서 == 메서드를 구현해야 하며 < 메서드도 구현해야 합니다.
으아악3. 표준 라이브러리 프로토콜은 다른 메서드가 선택 사항임을 나타내기 위해 프로토콜에서 @objc option 키워드를 사용하지 않고 프로토콜 서명 후에 이를 구현할 필요가 없는 이유는 무엇입니까?
//라이브러리의 유사한 프로토콜입니다.
으아악Havthgem의 답변: Swift 정적 라이브러리에는 사용자 정의 == 및 <
를 기반으로 나머지 비교 계산에 대한 기본 구현이 있습니다.으아악
위 내용은 Comparable 프로토콜의 설명입니다. 그래도 이해가 안 되시면 답글을 남겨주세요.