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

一、协议 | Protocols

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

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

//创建一个协议,协议说声明了一个方法Speak

protocol 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:Speaker

speaker = Ray()

speaker.Speak()

//这里会报错是因为speaker声明的是Sperker类型,而非Ray,所以只能调用Speaker协议中的方法,而不能调用Ray中的WriteTutorial方法(尽管speaker本质上是Ray类型的)

speaker.WriteTutorial() // error!

//将speaker转换成Ray类型,即可正常调用WriteTutorial方法

(speaker as Ray).WriteTutorial()



//因为Vicki类也是遵循Speaker协议的,所以这里也能将speaker设为Vicki

speaker = Vicki()

speaker.Speak()



//由于TellJoke为可选方法,在调用时需要检查其是否存在

speaker.TellJoke?()

speaker = Dog()

speaker.TellJoke?()

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

二、委托 | Delegates

你可能感兴趣的:(delegate)