首页 > 代码库 > Swift学习笔记(三):Protocols and Delegates

Swift学习笔记(三):Protocols and Delegates

一、协议 | Protocols

  协议用于定义完成某些功能所需要的方法和属性,协议本身并不提供这些功能的具体实现,只是用来描述这些实现。类、结构体、枚举通过提供协议所要求的方法、属性的具体实现来采用协议。能够满足协议要求的类型称之为协议的遵循者。

  协议可以要求遵循者提供特定的实例属性、实例方法、类方法、操作符或下标脚本等。

//创建一个协议,协议说声明了一个方法Speakprotocol Speaker {  func Speak()}//类Vicki遵循Speaker协议,在类中具体实现了Speak方法class Vicki: Speaker {  func Speak() {    println("Hello, I am Vicki!")  }}class Animal {}//Swift中单个类最多继承一个类,协议在含有父类的遵循类中需将协议放在父类后面(协议可以有多个)class Dog : Animal, Speaker {  func Speak() {    println("Woof!")  }}

  协议的optional方法:

//创建含有optional方法的协议,前面必须加上@objc标识@objc protocol Speaker {  func Speak()  //声明了一个optional方法    @optional func TellJoke()}//类Vicki并未实现TellJoke方法,并未报错,因其为可选的class Vicki: Speaker {  func Speak() {    println("Hello, I am Vicki!")  }} //类Ray实现了协议的所有方法class Ray: Speaker {  func Speak() {    println("Yo, I am Ray!")  }  func TellJoke() {    println("Q: Whats the object-oriented way to become wealthy?")  }  //非协议中的方法,无特定限制  func WriteTutorial() {    println("I‘m on it!")  }}

  协议的使用:

var speaker:Speakerspeaker = Ray()speaker.Speak()//这里会报错是因为speaker声明的是Sperker类型,而非Ray,所以只能调用Speaker协议中的方法,而不能调用Ray中的WriteTutorial方法(尽管speaker本质上是Ray类型的)speaker.WriteTutorial() // error!//将speaker转换成Ray类型,即可正常调用WriteTutorial方法(speaker as Ray).WriteTutorial()//因为Vicki类也是遵循Speaker协议的,所以这里也能将speaker设为Vickispeaker = Vicki()speaker.Speak()//由于TellJoke为可选方法,在调用时需要检查其是否存在speaker.TellJoke?()speaker = Dog()speaker.TellJoke?()

  使用?放在方法名后面用于在调用该方法是检查其是否存在,若不存在将返回nil

二、委托 | Delegates