首页 > 代码库 > 二十、协议 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。