iOS - Swift 面向协议编程(一)

OC没法作到面向协议开发,而Swift能够,由于Swift能够作到协议方法的具体实现,而OC不行c++

面向对象开发

传统的面向对象开发思惟方式是将类中实现的类似方法抽取出来,接着放入一个Base类,而后继承于Base类后各个类便可找拥有相同的方法,不用再一个个手动实现。 好比:一个Person类,一个Dog类,它们都拥有方法eat,那么就能够新建一个Animal类,将eat方法抽取出来放入其中,而后将Person类和Dog类都继承于Animal。 可是,若是如今又有一个Robot类,也须要拥有eat方法,而此时也将其继承于Animal的话显然是不合理的,因而咱们就须要转换思惟,面向协议开发~git

面向协议开发

面向协议开发的核心是:** 模块化(组件化) ** 咱们先来回顾下协议的通常使用,新建一个Swift文件LXFProtocol.swiftgithub

import Foundation

protocol LXFProtocol {
    func eat()
}
复制代码

咱们的Person类遵照协议LXFProtocol,须要咱们实现协议中的方法,如:编程

class Person: NSObject, LXFProtocol {
    func eat() {
        //
    }
}
复制代码

那咱们每一个类都这样作的话跟直接复制粘贴代码并没什么不一样~~ 而开头已经提到一点:swift

Swift能够作到协议方法的具体实现bash

那么如今,咱们新建一个Swift文件Eatable.swift,以区分LXFProtocol.swift Eatable.swift中的代码实现以下:微信

import Foundation

protocol Eatable {
    // 可声明变量
}

extension Eatable {
    func eat() {
        // 实现具体的功能
    }
}
复制代码

有2个注意点模块化

  • protocol中能够声明变量,方便在协议方法中使用
  • 协议方法的具体实现须要在extension中来实现

使Dog类遵照Eatable组件化

class Dog: NSObject, Eatable {

}
复制代码

这样咱们就能够在其它地方轻松调用dog的eat方法,Person类与Robot类也是如法炮制 post

至此,咱们就能够经过面向协议的方式给类定制不一样的功能,也就是模块化。能够发现Swift的面向协议编程跟c++的多继承很类似

约束

如今的这个Eatable协议是能够被任意遵照的,若是咱们有这么个需求,咱们建立的协议只是被UIViewController遵照,那咱们该怎么作呢? 【固然,Eatable协议只能被UIViewController遵照很扯淡,这里只是举例,不要太在乎咯~~】

在 extension 后面加上约束关键字【where】,并注明该协议只能被UIViewController这个类(包括子类)所遵照,并且此时咱们还能够拿到遵照该协议的控制器的view

//import Foundation
import UIKit

protocol Eatable {
    
}

extension Eatable where Self : UIViewController {
    func eat() {
        view.backgroundColor = UIColor.red
    }
}

复制代码

Demo 接下来以一个实际应用来巩固下吧 iOS - Swift 面向协议编程(二)

微信公众号
相关文章
相关标签/搜索