美文网首页iOS Developer
关于面向协议的开发之初探

关于面向协议的开发之初探

作者: 村长大人tardis_cxx | 来源:发表于2017-05-17 14:35 被阅读18次

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?

相关文章

网友评论

    本文标题:关于面向协议的开发之初探

    本文链接:https://www.haomeiwen.com/subject/lwedxxtx.html