swift里的代理协议

swift里可以替协议默认实现,即A类定义了一个协议,然后为protocol 写一个extension,在extension里为协议提供一个默认的实现方法,B类只需遵守次协议,B类不需写任何实现方法,只需调用就可。

如 student 类提供了一个协议借口:
protocol ScoresDelegate: class {
func allScores()
}

class Student: NSObject {

weak var delegate: ScoresDelegate?

}

extension ScoresDelegate {
func allScores() {
print("all scores")
}
}

B类只需遵守此协议,不用实现协议方法也可以通过。用的时候直接调用即可
class ViewController: UIViewController, ScoresDelegate {

override func viewDidLoad() {
    super.viewDidLoad()
    self.allScores()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()  
}

}
此时,打印结果为 all scores
当然,你也可以重新实现改协议方法:
class ViewController: UIViewController, ScoresDelegate {

override func viewDidLoad() {
    super.viewDidLoad()
    self.allScores()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
func allScores() {
    print("重新实现")
}

}
此时,打印结果为 重新实现

为协议扩张在某些时候可以为默认省去大量重复的代码。比如遵守该协议代理的类都只进行同一个步骤,我们不必在每个遵守该协议的类中重写操作;也不用去在别处封装一个方法,然后在遵守的类中调用。只需在protocol extension实现操作即可。

当然,你们可能注意到了我的协议后面跟了个class。这是因为,对于delegate,我们会在声明代理属性时将它指定为weak,在这个delegate实际对象被调用的时候,会被置为nil。但是swift里面,protocol可以被class以外的其它类型遵守,比如struct,但是struct是值类型,不存在引用计数来管理内存。而weak只使用类,所以在class类里若想使用weak delegate解决循环引用,需要在协议后面加class

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 熟悉Objective-C语言的同学们肯定对协议都不陌生,在Swift中苹果将protocol这种语法发扬的...
    老板娘来盘一血阅读 11,839评论 7 44
  • 转载:http://www.jianshu.com/p/e70bd6645d88前言 熟悉Objective-C语...
    guoshengboy阅读 4,650评论 0 1
  • 132.转换错误成可选值 通过转换错误成一个可选值,你可以使用 try? 来处理错误。当执行try?表达式时,如果...
    无沣阅读 5,130评论 0 3
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,873评论 0 9
  • 1、协议:定义一个规则去实现特定的功能,类、结构体、枚举都可以遵守这样的协议,并为这个协议的规则提供具体实现 pr...
    克鲁德李阅读 3,012评论 0 0

友情链接更多精彩内容