首页 > 代码库 > 二十、协议 Protocols

二十、协议 Protocols

1. 概述

协议只提供方法的声明,不提供实现。协议可以被类、结构体和枚举实现。

 

2. 协议的语法 Protocol Syntax

定义一个协议:

    protocol SomeProtocol {      // protocol definition goes here    }

如果一个类有某个父类或是需要遵守某个协议,将父类或协议写在冒号后面:

    class SomeClass: SomeSuperclass, FirstProtocol, AnotherProtocol {      // class definition goes here    }

 

3. 属性的要求 Property Requirements

 

4. 方法的要求 Method Requirements

协议中方法的参数不能有默认值。

在协议中,用 class 表示类方法,用 static 表示结构体方法和枚举方法(静态方法)。

    protocol SomeProtocol {      class func someTypeMethod()    }

比如,在协议中定义一个实例方法:

    protocol RandomNumberGenerator {      func random() -> Double    }

LinearCongruentialGenerator 实现了上面的协议:

    class LinearCongruentialGenerator: RandomNumberGenerator {      var lastRandom = 42.0      let m = 139968.0      let a = 3877.0      let c = 29573.0      func random() -> Double {        lastRandom = ((lastRandom * a + c) % m)        return lastRandom / m      }    }    let generator = LinearCongruentialGenerator()    println("Here‘s a random number: \(generator.random())")    // prints "Here‘s a random number: 0.37464991998171"    println("And another one: \(generator.random())")    // prints "And another one: 0.729023776863283"

 

5. 可变方法的要求 Mutating Method Requirements

在十、方法 Methods我们知道,在值类型(结构体和枚举)中,如果如果方法想要修改自己的那个实例,需要定义为 mutating 类型。

如果某个协议中的方法,需要修改实现了这个协议的实例的值,应该将方法定义为mutating 类型。这就是的实现了这个协议的枚举和结构体可以修改自己的实例本身。

注意:在类中,不需要写mutating关键字,mutating关键字为值类型专用。

定义一个协议:

    protocol Togglable {      mutating func toggle()    }

值类型OnOffSwitch 需要实现这个协议:

    enum OnOffSwitch: Togglable {      case Off, On      mutating func toggle() {        switch self {          case Off:            self = On          case On:            self = Off        }      }    }    var lightSwitch = OnOffSwitch.Off    lightSwitch.toggle()    // lightSwitch is now equal to .On

 

6. 构造器的需求 Initializer Requirements

 

二十、协议 Protocols