iOS 面向协议 Swift
在Swift语言开始盛行的当下,面向协议的开发,成为一个非常不错的思想,对整个工程架构起到了很重要的作用,也让开发变得十分灵活。
那么,什么是面向协议的开发呢?以下几个场景,对于体会面向协议开发有所帮助。
- 首先我们有一个
动物
类,即父类,动物按其栖息方式,有水栖动物如各种鱼类,陆栖动物如老虎大象,还有两栖动物如河马乌龟等等,这些都是动物
类的子类。动物
可以奔跑、可以爬行,可以游泳,但老虎大象可以游泳吗?鱼类可以爬行吗?如果我们用代码实现,每个子类都继承动物
这个父类,如此,继承父类,就继承了父类的一切!这是不是有些不太合理?- 依旧是
动物
类,我们知道鸟可以飞
,可飞这个动作似乎飞机也能飞,风筝也能飞,无人机也能飞,足球也能飞,甚至热气球也能飞,钢铁侠也能飞,难道我们都要继承自动物
吗?这合理吗?- 一个系列的车,有的有导航系统,有的没有导航系统,当某一天没有导航系统的需要加装导航系统,难道是要重新拆了按照有导航系统的车的结构重新制造吗?这合理吗?
- 具体到工程代码,展示在用户面前的内容,有些需要用户登录才能操作,比如有10个界面需要用户登录,难道我们要在这10个界面创建用户登录界面或者编写登录功能吗?这合理吗?
显而易见,上面四种场景是不合理的,那么面向协议的开发,就显得尤为重要:
对于第1、2个场景,我们可以定义这样一个协议,里面包含了动物的各种行为协议,哪一类动物就继承哪一种协议:
protocol Runable {
var age: Double { set get}
var headerCount: Int { get }
}
extension Runable {
var age: Double {
return 10
}
var headerCount: Int {
return 1
}
func running() {
print("running")
}
}
protocol Swimable {
}
extension Swimable {
func swimming() {
print("swimming")
}
}
protocol flyable {
}
extension flyable {
func flying() {
print("flying")
}
}
在Swift
中,实现协议可以不遵守基协议,也可以在extention
中为协议函数添加默认实现,当然也可以定义属性
,不过定义属性的话,要指定是可读可写,还是只读属性,一样的可以在extension
中添加默认实现。
当然,一般情况下,属性一般写在父类中!这样的话,不管是哪一种动物或者飞机什么的只要遵守对应的协议,就可以重新实现协议,场景中的不合理问题也迎刃而解。
既然协议可以添加默认实现,那是否可以在协议中封装一个小功能呢?比如车载系统功能,工程中的登录功能,当需要用的时候,遵守协议,直接拿来用就是了。
答案自然是可以的:
@objc protocol LoginProtocol {
@objc optional func login(inView view: UIView)
}
extension SportProtocol {
func login(inView view: UIView) {
let loginView = TCLoginView()
view.addSubview(loginView)
}
}
由上可以看出,协议,就像是一个功能小组件一样,把相同的功能拆分出来,不仅让我们减少了代码的冗余,而且十分方便,哪儿需要,哪儿遵守,哪儿实现!
最后,如果是某个类的协议,需要用的协议属性,那么就需要协议遵守基协议NSObjectProtocol
,或者class
,如非必要,一般我选择更加轻量级的后者!
@objc protocol TCShowViewDelegate: class {
@objc optional func showView(_ view: TCShowView, didSelectedBtn btn: UIButton)
}
// view中
weak var delegate: TCShowViewDelegate?
网友评论