iOS DeveloperiOSiOS点点滴滴

使用 extension 让你的代码更有条理

2015-12-01  本文已影响540人  PonyCui

你的 ViewController 非常混乱吗? 在 Swift 的世界里,有一种非常简单的魔法可以让你的 ViewController 变得条理分明。

如果你不知道什么叫做 extension, 那你应该去看看 Swift 教程。

简单来说,extension就是一个类的扩展,在 Objective-C 的世界里,它叫 Category。

为什么使用 extension 可以使我们的代码变得更有条理,请看代码。

假如我们有一个 UIViewController, 它控制着一个 UICollectionView,那么 UIViewController 也遵丛 UICollectionViewDataSource, UICollectionViewDelegate 两个协议,不使用 extension 的话,我们会这样写代码。

class TopicDetailMembersViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return 1
    }
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if let count = eventHandler.membersInteractor.topicItem?.members.count {
            return count
        }
        else {
            return 0
        }
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath)
        return cell
    }
    
}

但其实,我们可以让事情变得更有趣一些,使用 extension 可以这样写

class TopicDetailMembersViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
}

// MARK: - UICollectionViewDataSource, UICollectionViewDelegate
extension TopicDetailMembersViewController: UICollectionViewDataSource, UICollectionViewDelegate {
    
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return 1
    }
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if let count = eventHandler.membersInteractor.topicItem?.members.count {
            return count
        }
        else {
            return 0
        }
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath)
        return cell
    }
    
}

区分只是将一部分的代码移到另一个代码块中,代码量少的时候可能效果不明显,但当一个 ViewController 中充斥大量类似代码的时候,效果拔群。

上一篇下一篇

猜你喜欢

热点阅读