iOS - Swift 面向協議編程(二)

上一篇文章iOS - Swift 面向協議編程(一) 已經對Swift的面向協議編程作了介紹,接下來該篇文章將使用面向協議開發(POP)來作下實際的應用git

在實際開發中,自定義View基本上是必須的,相信這對咱們來講都是比較簡單,不過咱們仍是來回顧一下下~github

面向對象開發

1 新建一個UIView的FirstTypeView 編程

FirstTypeView

2 建立一個View的xib文件 swift

xib
3 設置xib對應的class進行綁定

xib class

4 在FirstTypeView.swift 中實現一個類方法,方便咱們外部用xib來初始化FirstTypeViewbash

import UIKit

class FirstTypeView: UIView {
    
}

extension FirstTypeView {
    class func loadFromNib() -> FirstTypeView {
        return Bundle.main.loadNibNamed("\(self)", owner: nil, options: nil)?.first as! FirstTypeView
    }
}
複製代碼

在外部只要調用FirstTypeView的loadFromNib方法就能夠初始化一個View來使用了。好,如今又有一個類SecondTypeView,也是要求使用xib來初始化view。這時咱們就會想,同樣的加載xib的方法,那咱們就把它抽取出來放到父類就能夠了。這裏的父類以BaseView.swift爲例 父類的主要實現代碼微信

extension BaseView {
    class func loadFromNib() -> BaseView {
        return Bundle.main.loadNibNamed("\(self)", owner: nil, options: nil)?.first as! BaseView
    }
}
複製代碼

那咱們的FirstTypeView和SecondTypeView只須要直接繼承於BaseView就能夠了,在其它地方初始化view也很方便post

let firstView = FirstTypeView.loadFromNib()
view.addSubview(firstView)

let secondView = SecondTypeView.loadFromNib()
view.addSubview(secondView)
複製代碼

好,如今FirstTypeView裏聲明瞭一個屬性name,SecondTypeView聲明的屬性爲age,假如咱們如今要使用各自對應的屬性,這時是直接點不出來的,須要先進行強轉ui

let firstView = FirstTypeView.loadFromNib() as! FirstTypeView
firstView.name = "LXF"
view.addSubview(firstView)

let secondView = SecondTypeView.loadFromNib() as! SecondTypeView
secondView.age = 100
view.addSubview(secondView)
複製代碼

可是這樣以爲不是很方便,還須要進行強轉,咱們能不能在BaseView裏面搞定它呢?若是是Swift 2.x 的話是能夠的spa

extension BaseView {
    class func loadFromNib() -> Self { // 注意這裏是大寫的S
        return Bundle.main.loadNibNamed("\(self)", owner: nil, options: nil)?.first as! Self
    }
}
複製代碼

可是如今Swift 3.0已經不支持這種寫法了,會報錯。這個時候若是使用面向協議的開發就很方便了。3d

面向協議開發

將BaseView刪除,FirstTypeView和SecondTypeView改回繼承於UIView

1 新建一個Swift文件 Nibloadable.swift

Nibloadable

2 實現協議方法

協議中不容許定義類方法,需改成靜態方法

import UIKit

protocol Nibloadable {
    
}

extension Nibloadable {
    static func loadFromNib() -> Self {
        return Bundle.main.loadNibNamed("\(self)", owner: nil, options: nil)?.first as! Self
    }
}
複製代碼

3 遵照協議

class SecondTypeView: UIView, Nibloadable {
    var age: Int = 10
}
複製代碼

這樣就能夠了,並且你在調用loadFromNib方法時能夠發現,類型是對應上的

loadFromNib協議方法

好了,面向協議開發的應用就記錄到這裏,但願能幫助到你們!

Demo

微信公衆號
相關文章
相關標籤/搜索