用swift寫應用差不多一年多了惊科,雖然時間還比較短拍摇,但是深刻感覺到了swift是iOS開發(fā)的未來,沒有理由不去掌握它馆截,OC的時代在我個人這里已經結束了充活。
這篇文章我只是講一下我在開發(fā)過程中,使用面向協(xié)議編程中的第一個方面蜡娶,雖然簡單混卵,還是希望可以起到拋磚引玉的作用吧。
為什么說面向協(xié)議編程我們要重視呢窖张,原因很簡單就是消滅: God object
進入正文:
假設你有這么個需求幕随,所有頁面的navigationBar上面都有一個編輯【菜單】之類的按鈕,你會怎么做呢宿接?大部分人一般都會用繼承赘淮,讓父類擁有這個Item按鈕。然后每個需要它的人去繼承這個父類就可以了睦霎。如圖:
在仔細想一下不是所有的類都會繼承ViewController的梢卸。比如TableViewController等等。難道我們要去創(chuàng)建N個父類么副女?也許你會說有別的需求也是可以寫到父類里面去的蛤高,總結歸納一下不就可以了?但是swift給我?guī)砹嗣嫦騾f(xié)議這個編程思想。
這里舉個item的例子戴陡,同樣塞绿,我們可以舉一反三。把想要的功能都做成協(xié)議恤批,想怎么用直接拿過來异吻,遵循協(xié)議即可。徹底將功能模塊化开皿。模塊化的程序設計是每個程序員所追求的終極目標涧黄。我們不斷的重構代碼,不斷的組合我們自己的代碼庫赋荆,原因就是這點笋妥,代碼重用,功能重用窄潭,遷移方便春宣。所以最好掌握swift面向協(xié)議編程。Mixins 比繼承更好 為什么將封裝改成協(xié)議的案例這篇文章有詳細說明嫉你。
1.創(chuàng)建BlockMenuBarButton
繼承自UIBarButtonItem
2.創(chuàng)建一個閉包用于添加按鈕點擊事件typealias ZKBarButtonItemBlock = () -> ()
3.并在類中寫入一下代碼【注釋有解釋】
var itemBlock: ZKBarButtonItemBlock?
// 給繼承的類添加構造方法
convenience init(title: String, style: UIBarButtonItemStyle, block: ZKBarButtonItemBlock) {
// 這里自己遇到一個小小的坑月帝,swift在書寫的時候可以省略self,但是這里不能省略self
self.init(title: title, style: style, target: nil, action: #selector(barButtonItemDidTouch))
target = self
itemBlock = block
}
// 給繼承的類添加構造方法
convenience init(image: UIImage, style: UIBarButtonItemStyle, block: ZKBarButtonItemBlock) {
// 同上
self.init(image: image, style: style, target: nil, action: #selector(barButtonItemDidTouch))
target = self
itemBlock = block
}
// 點擊之后觸發(fā)的方法
func barButtonItemDidTouch() {
guard let itemBlock = itemBlock else {
return
}
itemBlock()
}
// 添加協(xié)議
protocol MenuButtonManager {
// 添加item方法
func needMenuButtonManager()
}
// 協(xié)議擴展
extension MenuButtonManager where Self: UIViewController {
// 方法的默認實現(xiàn)
func needMenuButtonManager() {
let item = BlockMenuBarButton(title: "菜單", style: .Plain) {
print("這個是默認實現(xiàn)方法")
}
navigationItem.leftBarButtonItem = item
}
}
4.使用的時候:
class ViewController: UIViewController, MenuButtonManager {
override func viewDidLoad() {
super.viewDidLoad()
// 調用方法
needMenuButtonManager()
}
}
直接調用會觸發(fā)默認方法幽污,也可以復寫協(xié)議方法
class MyTableViewController: UITableViewController, MenuButtonManager {
override func viewDidLoad() {
super.viewDidLoad()
needMenuButtonManager()
}
func needBurgerMenuManager() {
let item = BlockMenuBarButton(title: "添加", style: .Plain) {
print("自定義button1")
}
navigationItem.leftBarButtonItem = item
}
}
除了閉包的實現(xiàn)方法以外嚷辅,還可以使用runtime,這里不介紹了距误。個人不是很喜歡簸搞,另外swift有意在弱化runtime所以還算是跟隨形勢走比較好一些。
歡迎加入我個人維護QQ群:379069176
PS:定期分享干貨