swift協議

ytmaylover發表於2018-09-05

1.協議

  • 協議的語法:

  • 定義協議

  • 遵守協議:在型別名稱後面,加上協議名稱,用: 隔開,協議之間用,隔開

  • 繼承父類的子類的時候,應該把父類寫在協議前面,

    protocol SomeProtocol {}
    class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {}
    複製程式碼
  • 屬性要求

  • 協議中定義了屬性,遵守該協議的例項或型別,必須有這個屬性

  • 協議的中定義屬性,只指定屬性的名稱和型別,還指定屬性的可讀性,可寫性,

    swift協議
    swift協議

  • 方法要求

  • 和普通方法一樣,但不需要{} 和方法體,方法的引數列表也不支援預設值

  • Mutating 方法要求

  • 如果你在協議中定義了一個例項方法,該方法會改變遵循該協議的型別的例項,那麼在定義協議時需要在方法前加 mutating 關鍵字。這使得結構體和列舉能夠遵循此協議並滿足此方法要求。

  • 構造器要求

  • 協議可以要求遵循協議的型別實現指定的構造器。你可以像編寫普通構造器那樣,在協議的定義裡寫下構造器的宣告,但不需要寫花括號和構造器的實體

    swift協議
    swift協議

  • 實現的時候,遵守代理的構造器方法需要加上關鍵字required

  • 如果一個類是定義了final,不需要在寫required,因為不會有子類,final是為了防止重寫

  • 如果子類重寫了父類的指定構造器,並且指定構造器遵循了某個協議,該方法同時需要寫關鍵字requiredoverri

  • 協議作為型別

    class Dice {
        let sides: Int
        let generator: RandomNumberGenerator
        init(sides: Int, generator: RandomNumberGenerator) {
            self.sides = sides
            self.generator = generator
        }
        func roll() -> Int {
            return Int(generator.random() * Double(sides)) + 1
        }
    }
    複製程式碼
  • Dice 類提供了一個名為 roll 的例項方法,用來模擬骰子的面值。它先呼叫 generator 的 random() 方法來生成一個 [0.0,1.0) 區間內的隨機數,然後使用這個隨機數生成正確的骰子面值。因為 generator 遵循了 RandomNumberGenerator 協議,可以確保它有個 random() 方法可供呼叫

2.委託(代理)模式

  • protocol - delegate

    swift協議

3.通過擴充套件新增協議一致性,通過擴充套件遵循協議

  • 當一個型別已經符合了某個協議中的所有要求,卻還沒有宣告遵循該協議時,可以通過空擴充套件體的擴充套件來遵循該協議:

4.協議型別的集合,協議的繼承

  • 協議能夠繼承一個或多個其他協議,可以在繼承的協議的基礎上增加新的要求

    swift協議

  • 例子中定義了一個新的協議 PrettyTextRepresentable,它繼承自 TextRepresentable 協議。任何遵循 PrettyTextRepresentable 協議的型別在滿足該協議的要求時,也必須滿足 TextRepresentable 協議的要求

5.類型別專屬協議

  • 只適用一某種型別

    swift協議

6.協議合成

  • 有時候需要同時遵循多個協議,你可以將多個協議採用 SomeProtocol & AnotherProtocol 這樣的格式進行組合,稱為 協議合成(protocol composition)。你可以羅列任意多個你想要遵循的協議,以與符號(&)分隔。

    swift協議

7.檢查協議一致性

  • Circle,Country,遵守了HasArea協議,協議中有隻讀的area屬性

  • Animal 沒有遵守HasArea協議

  • 上面三個各自例項,判斷是不是符合某個協議的,使用as?, 返回可選值,進行可選值繫結

    swift協議
    swift協議

8.可選的協議要求

  • 可選的時候使用optional 關鍵字
  • 可選要求用在你需要和 Objective-C 打交道的程式碼中。協議和可選要求都必須帶上@objc屬性
    @objc protocol CounterDataSource {
        optional func incrementForCount(count: Int) -> Int
        optional var fixedIncrement: Int { get }
    }
    複製程式碼
    swift協議

8.協議擴充套件

  • 協議可以通過擴充套件來為遵循協議的型別提供屬性、方法以及下標的實現。通過這種方式,你可以基於協議本身來實現這些功能,而無需在每個遵循協議的型別中都重複同樣的實現,也無需使用全域性函式

  • 擴充套件RandomNumberGenerator協議,增加randomBool() 方法

    extension RandomNumberGenerator {
        func randomBool() -> Bool {
        return random() > 0.5
        }
    }
    複製程式碼
  • 提供預設實現

    swift協議

  • 為協議擴充套件新增限制條件

  • 在擴充套件協議的時候,可以指定一些限制條件,只有遵循協議的型別滿足這些限制條件時,才能獲得協議擴充套件提供的預設實現。這些限制條件寫在協議名之後,使用 where 子句來描述

    swift協議
    swift協議
    swift協議

  • textualDescription返回整個集合的文字描述,講文字描述用,拼接起來,包括在【】中

  • Hamster 結構體符合TextRepresentable協議,放在一個陣列中,array 符合CollectionType協議,

  • 可以進行textualDescription方法,

  • 如果多個協議擴充套件都為同一個協議要求提供了預設實現,而遵循協議的型別又同時滿足這些協議擴充套件的限制條件,那麼將會使用限制條件最多的那個協議擴充套件提供的預設實現

相關文章