你的 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 中充斥大量类似代码的时候,效果拔群。