>  Q&A  >  본문

ios - swift 标准库中协议的相关问题

先附上代码:

//自定义结构体类型,进行大小比较
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协议的方法为什么是在{ }外实现的?

迷茫迷茫2716일 전724

모든 응답(2)나는 대답할 것이다

  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:38:51

    요약하자면:

    1. 인스턴스 비교: 두 인스턴스의 값이 같은지 확인Equatable

    Equatable 프로토콜: == 메소드를 구현해야 하며, 양측의 데이터 유형을 비교하여 해당 == 메소드를 선택합니다.

    으아악
    2. 두 인스턴스의 크기 비교 Comparable

    비교 가능한 프로토콜: Equatable에서 상속되며 Equatable에서 == 메서드를 구현해야 하며 < 메서드도 구현해야 합니다.

    으아악
    3. 표준 라이브러리 프로토콜은 다른 메서드가 선택 사항임을 나타내기 위해 프로토콜에서 @objc option 키워드를 사용하지 않고 프로토콜 서명 후에 이를 구현할 필요가 없는 이유는 무엇입니까?
    //라이브러리의 유사한 프로토콜입니다.
    으아악

    Havthgem의 답변: Swift 정적 라이브러리에는 사용자 정의 == 및 <

    를 기반으로 나머지 비교 계산에 대한 기본 구현이 있습니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-18 09:38:51

    으아악

    위 내용은 Comparable 프로토콜의 설명입니다. 그래도 이해가 안 되시면 답글을 남겨주세요.

    회신하다
    0
  • 취소회신하다