美文网首页
swift面向协议编程,打造TabbarItem

swift面向协议编程,打造TabbarItem

作者: HenryPeng | 来源:发表于2016-04-18 16:08 被阅读142次

用swift写应用差不多一年多了,虽然时间还比较短,但是深刻感觉到了swift是iOS开发的未来,没有理由不去掌握它,OC的时代在我个人这里已经结束了。

这篇文章我只是讲一下我在开发过程中,使用面向协议编程中的第一个方面,虽然简单,还是希望可以起到抛砖引玉的作用吧。

为什么说面向协议编程我们要重视呢,原因很简单就是消灭: God object

进入正文:

假设你有这么个需求,所有页面的navigationBar上面都有一个编辑【菜单】之类的按钮,你会怎么做呢?大部分人一般都会用继承,让父类拥有这个Item按钮。然后每个需要它的人去继承这个父类就可以了。如图:


God object

在仔细想一下不是所有的类都会继承ViewController的。比如TableViewController等等。难道我们要去创建N个父类么?也许你会说有别的需求也是可以写到父类里面去的,总结归纳一下不就可以了?但是swift给我带来了面向协议这个编程思想。
这里举个item的例子,同样,我们可以举一反三。把想要的功能都做成协议,想怎么用直接拿过来,遵循协议即可。彻底将功能模块化。模块化的程序设计是每个程序员所追求的终极目标。我们不断的重构代码,不断的组合我们自己的代码库,原因就是这点,代码重用,功能重用,迁移方便。所以最好掌握swift面向协议编程。Mixins 比继承更好 为什么将封装改成协议的案例这篇文章有详细说明。

1.创建BlockMenuBarButton继承自UIBarButtonItem
2.创建一个闭包用于添加按钮点击事件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
 }
 
 // 点击之后触发的方法
 func barButtonItemDidTouch() {
  guard let itemBlock = itemBlock else {
   return
  }
  itemBlock()
 }

// 添加协议
protocol MenuButtonManager {
 // 添加item方法
 func needMenuButtonManager()
}
// 协议扩展
extension MenuButtonManager where Self: UIViewController {
 // 方法的默认实现
 func needMenuButtonManager() {
  let item = BlockMenuBarButton(title: "菜单", style: .Plain) {
   print("这个是默认实现方法")
  }
  navigationItem.leftBarButtonItem = item
 }
}

4.使用的时候:

class ViewController: UIViewController, MenuButtonManager {

 override func viewDidLoad() {
  super.viewDidLoad()
  // 调用方法
  needMenuButtonManager()
 }
}

直接调用会触发默认方法,也可以复写协议方法

class MyTableViewController: UITableViewController, MenuButtonManager {

    override func viewDidLoad() {
        super.viewDidLoad()
  needMenuButtonManager()
  
    }
 
 func needBurgerMenuManager() {
  let item = BlockMenuBarButton(title: "添加", style: .Plain) {
   print("自定义button1")
  }
  navigationItem.leftBarButtonItem = item
 }
}

除了闭包的实现方法以外,还可以使用runtime,这里不介绍了。个人不是很喜欢,另外swift有意在弱化runtime所以还算是跟随形势走比较好一些。
欢迎加入我个人维护QQ群:379069176
PS:定期分享干货

相关文章

  • swift面向协议编程,打造TabbarItem

    用swift写应用差不多一年多了,虽然时间还比较短,但是深刻感觉到了swift是iOS开发的未来,没有理由不去掌握...

  • swift和OC的比较

    swift ----OC比较 编程范式 Swift 可以面向协议编程、函数式编程、面向对象编程。Objective...

  • [Swift5.1] 27-面向协议编程

    面向协议编程 面向协议编程(Protocol Oriented Programming,简称POP) 是Swift...

  • Swift 中协议的扩展的简单应用

    参考: Swift面向协议编程初探 从 Swift 的面向协议编程说开去 根据下面的结构 设计类和协议 使用:

  • Swift 中的面向协议编程

    Swift 中面向协议编程的应用,与面向对象不同的编程模式。在 Swift 这个现代化的编程语言中,感受面向协议带...

  • Swift 面向协议编程遇到的问题

    Swift 面向协议编程 背景 Swift 面向协议编程在 WWDC 2015 中提出, 业界已经有很多优秀的实践...

  • Swift面向协议编程

    Swift面向协议编程 不要用子类!Swift的核心是面向协议 Protocol Oriented Program...

  • Swift-面向协议编程(转载)

    Swift的核心 我们可以通过等式的传递性来理解swift: Swift的核心是面向协议的编程。 面向协议的编程的...

  • 面向协议编程

    面向协议编程 面向协议编程Protocol Oriented Programming简称POP.是Swift的一种...

  • Swift从入门到精通-1

    一、Swift和Objective-C比较 1、编程范式:Swift可以面向协议编程,函数式编程,面向对象编程;O...

网友评论

      本文标题:swift面向协议编程,打造TabbarItem

      本文链接:https://www.haomeiwen.com/subject/nxqhlttx.html