swift面向協(xié)議編程,打造TabbarItem

用swift寫應用差不多一年多了惊科,雖然時間還比較短拍摇,但是深刻感覺到了swift是iOS開發(fā)的未來,沒有理由不去掌握它馆截,OC的時代在我個人這里已經結束了充活。

這篇文章我只是講一下我在開發(fā)過程中,使用面向協(xié)議編程中的第一個方面蜡娶,雖然簡單混卵,還是希望可以起到拋磚引玉的作用吧。

為什么說面向協(xié)議編程我們要重視呢窖张,原因很簡單就是消滅: God object

進入正文:

假設你有這么個需求幕随,所有頁面的navigationBar上面都有一個編輯【菜單】之類的按鈕,你會怎么做呢宿接?大部分人一般都會用繼承赘淮,讓父類擁有這個Item按鈕。然后每個需要它的人去繼承這個父類就可以了睦霎。如圖:


God object

在仔細想一下不是所有的類都會繼承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:定期分享干貨

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末准潭,一起剝皮案震驚了整個濱河市趁俊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刑然,老刑警劉巖寺擂,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泼掠,居然都是意外死亡怔软,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門武鲁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爽雄,“玉大人,你說我怎么就攤上這事沐鼠。” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵饲梭,是天一觀的道長乘盖。 經常有香客問我,道長憔涉,這世上最難降的妖魔是什么订框? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮兜叨,結果婚禮上穿扳,老公的妹妹穿的比我還像新娘。我一直安慰自己国旷,他們只是感情好矛物,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跪但,像睡著了一般履羞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屡久,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天忆首,我揣著相機與錄音,去河邊找鬼被环。 笑死糙及,一個胖子當著我的面吹牛,可吹牛的內容都是我干的筛欢。 我是一名探鬼主播浸锨,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悴能!你這毒婦竟也來了揣钦?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤漠酿,失蹤者是張志新(化名)和其女友劉穎冯凹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炒嘲,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡宇姚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了夫凸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浑劳。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖夭拌,靈堂內的尸體忽然破棺而出魔熏,到底是詐尸還是另有隱情衷咽,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布蒜绽,位于F島的核電站镶骗,受9級特大地震影響,放射性物質發(fā)生泄漏躲雅。R本人自食惡果不足惜鼎姊,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望相赁。 院中可真熱鬧相寇,春花似錦、人聲如沸钮科。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跺嗽。三九已至战授,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桨嫁,已是汗流浹背植兰。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留璃吧,地道東北人楣导。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像畜挨,于是被迫代替她去往敵國和親筒繁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容

  • 第一章.面向對象與面向協(xié)議編程 本書是關于面向協(xié)議編程巴元。當蘋果2015年的開發(fā)者大會上發(fā)布了Swift2毡咏,他們也宣...
    醬油不愛醋閱讀 1,373評論 0 7
  • 登山者走到半路,累了逮刨,尋到一塊小明一樣高的光滑石頭坐下呕缭。 挪開你的屁股,你有什么資格坐我修己。 石頭一臉不滿恢总,憤憤地說...
    常七七七閱讀 195評論 0 0
  • 怎么辦啊,每次從家里回來的時候都特別特別想家睬愤。我也不想啊片仿,忍都忍不住的想家。
    從前有一個葡萄閱讀 101評論 0 0
  • 我早該知道的奸鸯,我們的關系咪笑,不過是你需要人陪伴的時候娄涩,我恰好在映跟。 2017年11月19日 星期日 晴 文|深海夢影 ...
    深海夢影閱讀 4,033評論 78 155
  • 什么是Quartz2D Quartz 2D 是一個二維繪圖引擎,同時支持iOS和Mac系統(tǒng) Quartz 2D的作...
    SevEnOye閱讀 217評論 0 0