ios - swift 标准库中协议的相关问题
迷茫
迷茫 2017-04-18 09:36:51
0
2
804

先附上代码:

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

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全員に返信(2)
伊谢尔伦

要約すると:

1. インスタンスの比較: 2 つのインスタンスの値が同じかどうかを判断します Equatable

同等プロトコル: == メソッドを実装する必要があり、対応する == メソッドは双方のデータ型の比較に基づいて選択されます。

リーリー
2. 2 つのインスタンスのサイズを比較します Comparable

同等のプロトコル: Equatable から継承され、Equatable で == メソッドを実装する必要があり、< メソッドも実装する必要があります。

リーリー
3. 標準ライブラリ プロトコルでは、他のメソッドがオプションであり、プロトコルの署名後に実装する必要がないことを示すために、プロトコル内で @objc オプションのキーワードが使用されないのはなぜですか?
//ライブラリ内の同等のプロトコル。
リーリー

Havthgem の答え: Swift 静的ライブラリには、カスタム == と <

に基づいて、残りの比較計算のデフォルト実装があります。
いいねを押す +0
Ty80

リーリー

上記は Comparable プロトコルからのコメントです。それでも理解できない場合は、返信してください。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート