MG--Swift面向協議開發
得益於面嚮物件語言的特性 (封裝、繼承、多型) 在我們熟悉的設計模式中漸漸形成統一的軟體開發思想,但是由於OC的侷限性, 使得iOS開發元件化程式設計變得十分繁瑣,需要將一些功能拆分為類,在抽取某些功能作為基類的不斷運用中,程式碼的可移植性逐漸減弱。就如同一棵樹,從主幹到各個分支,每個分支再長成細枝末葉。程式碼的耦合性也相應增加。隨著蘋果 swift 語言的推出,對於傳統OC 語言取其精華,棄其糟粕。 加上開源社群眾大神的齊力維護。逐漸成為一門非常優秀的高階語言。其中Swift中的面向協議程式設計思想就是其中很有代表性的一項優秀組成部分。
Swift的 POP 是使用了繼承的思想,它模擬了多繼承關係,實現了程式碼的跨父類複用,同時也不存在 is-a 關係。swift中主類和 extension擴充套件類 的協同工作,保留了 在主類中定義方法 在所繼承的類中進行實現的特性,又新增了在 extension擴充類 中定義並實現的方法在任何繼承自此協議的類中可以任意呼叫,從而實現元件化程式設計。
自定義協議
- 於是我們可以使用協議做一些最佳化,精簡開發中所寫程式碼,????請看程式碼
//
// MGProtocol+extesnsion.swift
// MGSDK
//
// Created by Nicky Y M LIU_SP on 2021/1/11.
// Copyright © 2021 Nicky Y M LIU_SP. All rights reserved.
//
import UIKit
public protocol MGReusableViewAble: class {}
extension MGReusableViewAble where Self: UIView {
public static var reuseIdentifier: String {
return String("(self)")
}
}
public protocol MGNibLoadAbleViewAble: class { }
extension MGNibLoadAbleViewAble where Self: UIView {
public static func loadViewWithNib() -> Self {
return Bundle.main.loadNibNamed("(self)", owner: nil, options: nil)?.last! as! Self
}
public static var nibName: String {
return String("(self)")
}
}
// MARK: - extension
extension UITableView {
// Register
public func registerCellFromNib<T: UITableViewCell>(_: T.Type) where T: MGReusableViewAble, T: MGNibLoadAbleViewAble {
let Nib = UINib(nibName: T.nibName, bundle: nil)
register(Nib, forCellReuseIdentifier: T.reuseIdentifier)
}
public func registerCell<T: UITableViewCell>(_: T.Type) where T: MGReusableViewAble {
register(T.self, forCellReuseIdentifier: T.reuseIdentifier)
}
public func registerHeaderFooterFromNib<T: UITableViewHeaderFooterView>(_: T.Type) where T: MGReusableViewAble, T: MGNibLoadAbleViewAble {
let Nib = UINib(nibName: T.nibName, bundle: nil)
register(Nib, forHeaderFooterViewReuseIdentifier: T.reuseIdentifier)
}
public func registerHeaderFooter<T: UITableViewHeaderFooterView>(_: T.Type) where T: MGReusableViewAble {
register(T.self, forHeaderFooterViewReuseIdentifier: T.reuseIdentifier)
}
public func dequeueReusableCell<T: UITableViewCell>(forIndexPath indexPath: IndexPath) -> T where T: MGReusableViewAble {
guard let cell = dequeueReusableCell(withIdentifier: T.reuseIdentifier, for: indexPath) as? T else {
fatalError("Could not dequeue cell with identifier: (T.reuseIdentifier)")
}
return cell
}
}
extension UICollectionView {
// Register
public func registerCellFromNib<T: UICollectionViewCell>(_: T.Type) where T: MGReusableViewAble, T: MGNibLoadAbleViewAble {
let Nib = UINib(nibName: T.nibName, bundle: nil)
register(Nib, forCellWithReuseIdentifier: T.reuseIdentifier)
}
public func registerCell<T: UICollectionViewCell>(_: T.Type) where T: MGReusableViewAble {
register(T.self, forCellWithReuseIdentifier: T.reuseIdentifier)
}
// elementKindSectionHeader elementKindSectionFooter
public func registerHeaderFooter<T: UICollectionReusableView>(_: T.Type, elementKind: String) where T: MGReusableViewAble, T: MGNibLoadAbleViewAble {
let Nib = UINib(nibName: T.nibName, bundle: nil)
register(Nib, forSupplementaryViewOfKind: elementKind, withReuseIdentifier: T.reuseIdentifier)
}
public func registerHeaderFooter<T: UICollectionReusableView>(_: T.Type, elementKind: String) where T: MGReusableViewAble {
register(T.self, forSupplementaryViewOfKind: elementKind, withReuseIdentifier: T.reuseIdentifier)
}
// dequeueReusable
public func dequeueReusableCell<T: UICollectionViewCell>(forIndexPath indexPath: IndexPath) -> T where T: MGReusableViewAble {
guard let cell = dequeueReusableCell(withReuseIdentifier: T.reuseIdentifier, for: indexPath) as? T else {
fatalError("Could not dequeue cell with identifier: (T.reuseIdentifier)")
}
return cell
}
}
使用
- 我們如何使用呢,只需要建立的class或者struct 遵守協議,便擁有了此方法,
- 舉個例子來說,.xib 載入 UIView,只要在xib載入的類中繼承此協議MGNibLoadAbleViewAblecolor{#FF0000}{MGNibLoadAbleViewAble}MGNibLoadAbleViewAble,
class MGRedView: UIView, MGNibLoadAbleViewAble {}
,就可以在需要初始化此物件時直接呼叫let view = MGRedView.loadViewWithNib()
,也可以檢視下面的程式碼
下面我們來精簡UITableView的註冊和迴圈利用方法
- MGTableViewCell遵守MGReusableViewAblecolor{#0000FF}{MGReusableViewAble}MGReusableViewAble協議
import UIKit
import MGSDK
class MGTableViewCell: UITableViewCell, MGReusableViewAble {
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
- 主要看registerCellcolor{#0000FF}{registerCell}registerCell和 dequeueReusableCellcolor{#0000FF}{dequeueReusableCell}dequeueReusableCell方法
import UIKit
import MGSDK
class MGTabViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .white
self.view.addSubview(self.tableView)
tableView.leftAnchor.constraint(equalTo: self.view.leftAnchor,constant: 0).isActive = true
tableView.topAnchor.constraint(equalTo: self.view.topAnchor,constant: 0).isActive = true
tableView.rightAnchor.constraint(equalTo: self.view.rightAnchor,constant: 0).isActive = true
tableView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor,constant: 0).isActive = true
}
private lazy var tableView: UITableView = {
let tableView = UITableView(frame: self.view.frame, style: UITableView.Style.plain)
tableView.delegate = self
tableView.dataSource = self
tableView.tableFooterView = UIView()
tableView.registerCell(MGTableViewCell.self)
return tableView
}()
}
extension MGTabViewController :UITableViewDelegate,UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
10
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(forIndexPath: indexPath) as MGTableViewCell
return cell
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/430/viewspace-2826837/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 面向協議程式設計協議程式設計
- Swift Protocol 詳解 - 協議&面向協議程式設計SwiftProtocol協議程式設計
- 淺析面向協議程式設計協議程式設計
- Swift:面向協議的網路請求Swift協議
- ios 面向協議程式設計資源iOS協議程式設計
- iOS - Swift 面向協議程式設計(二)iOSSwift協議程式設計
- iOS - Swift 面向協議程式設計(一)iOSSwift協議程式設計
- Swift中的面向協議程式設計Swift協議程式設計
- 微信開發介面API協議API協議
- iOS 面向協議方式封裝空白頁功能iOS協議封裝
- Swift 面向協議程式設計的那些事Swift協議程式設計
- iOS 面向協議封裝全屏旋轉功能iOS協議封裝
- 遊戲開發—協議設計遊戲開發協議
- 從Swift3的標準庫協議看面向協議程式設計(一)Swift協議程式設計
- 面向協議程式設計的一些思考協議程式設計
- Swift 核心動畫 面向協議 擴充套件封裝Swift動畫協議套件封裝
- 瞭解開源協議:常用開源協議解析協議
- ios開發-UI高階 HTTP協議iOSUIHTTP協議
- iOS開發之VPN協議(理論)iOS協議
- 遊戲開發-協議設計-protobuf遊戲開發協議
- 郵件開發:SMTP協議詳解協議
- ntp協議及客戶端開發協議客戶端
- 開源協議協議
- iOS 工廠模式的面向協議程式設計思想iOS模式協議程式設計
- [譯] Swift 寫網路層:用面向協議的方式Swift協議
- 面向協議程式設計與 Cocoa 的邂逅 (下)協議程式設計
- 面向協議程式設計與 Cocoa 的邂逅 (上)協議程式設計
- Cisco發現協議協議
- fir.im Weekly - 揭祕 iOS 面向協議程式設計iOS協議程式設計
- Swift 面向協議程式設計 基礎篇 (一) 介紹Swift協議程式設計
- Free自由協議系統開發(複利模式)協議模式
- 郵件開發:POP3協議詳解協議
- Socket開發框架之資料傳輸協議框架協議
- 龍蜥白皮書精選:面向 DPU 場景的軟硬協同協議棧協議
- 影片直播原始碼開發中的流媒體協議:rtmp協議原始碼協議
- 【網路協議】IP協議、ARP協議、RARP協議協議
- CDP 思科發現協議協議
- 大白話開源協議協議