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