一、协议 | 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
Swift学习笔记(三):Protocols and Delegates,布布扣,bubuko.com
Swift学习笔记(三):Protocols and Delegates
原文:http://www.cnblogs.com/Evan-You/p/3854912.html