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

posted @ 2014-07-19 14:54  Evan_You  阅读(182)  评论(0编辑  收藏  举报