swift可选协议

2016-08-18  本文已影响945人  flyrr

swift是面向协议编程的。。。但是我在这实现的过程中,有一个过不去的坎---那就是,OC里面有可选协议,但是swift的是明确,协议是必须实现的。这个百度了一下,出现了很多,但是答案就是用@objc链接到OC。。。然后在使用可选协议,但是这个做法不简洁,不像swift。。。
然后我自己琢磨了协议以及extension,实现了swift的可选协议。
那就是我们定义一个协议,把必须实现的协议直接写在协议本体里面,然后可选协议写在协议的extension里面。
看代码:

/**
 *  导航栏协议
 */
protocol NaviItemManager {}

extension NaviItemManager where Self: UIViewController {
    /**
     返回上一界面---默认pop
     */
    func disMissMenuItemManager() {
        let item = BlockMenuBarItem(image: UIImage.imageWithName(NaviItemImages.Back.rawValue, model: .AlwaysOriginal), style: .Done) {
            self.navigationController?.popViewControllerAnimated(true)
        }
        navigationItem.leftBarButtonItem = item
    }
    
    /**
     查看客服--默认
     */
    func checkKeFuItemManager() {
        let item = BlockMenuBarItem(image: UIImage.imageWithName(NaviItemImages.Kefu.rawValue, model: .AlwaysOriginal), style: .Done) {
            HCM_HomeRootViewModel().gotoWebView(WebType.Kefu, at: self)
        }
        navigationItem.rightBarButtonItem = item
    }
}

这个是我app里面的代码的一部分,这两个协议因为放在extension里面,所以他们都是可选的。
然后调用的时候,我们就不用全部都准守了。

extension CardController: NaviItemManager {
    private func setUpUI() {
       title = "身份证认证"
        disMissMenuItemManager()
    }
}

那么,假如说,有必须实现的协议的话就直接放在本体里面,不要写在协议的extension里面就行了

上一篇 下一篇

猜你喜欢

热点阅读