Swift3之将类作为参数

文章目录

何谓将类名作为参数

举个栗子

看这么一个需求:

一个 tableview,其中的 cell 是 nib 写的

步骤:

  1. 定义 1 个 cell 和对应的 xib
  2. 在 ViewController 中定义一个 Xib 加载对应文件,注册 xib

这个时候有一些步骤就是需要定义一个 xib 的文件名,cell 的 identitier,但是这两个东西都是字符串,如果一个字母敲错了或者后续业务逻辑/功能有更改,那么当你要修改 cell 对应的类名时,你就不得不一起修改文件名,字符串的名字,所有引用的名称..等等步骤

这个时候就要想了,如果将这个 Cell 实现一个 protocol,protocol 中有 xibName,identifier,同时每个类去实现,然后 tableview 注册方法中只传类名不就可以了吗,这样以后如果有修改都只在 Cell 的类内部去写,就不容易出错了

实现步骤

定义一个 Protocol

1protocol NibCell {
2
3    static func nibName() -> String
4
5    static func identifier() -> String
6
7}

定义一个 Cell

 1import UIKit
 2
 3class OrderDetailCell: UITableViewCell,NibCell {
 4
 5    static func nibName() -> String {
 6        return "OrderDetailCell"
 7    }
 8
 9    static func identifier() -> String {
10        return "OrderDetailCell"
11    }
12
13    override func awakeFromNib() {
14        super.awakeFromNib()
15        // Initialization code
16    }
17    override func setSelected(_ selected: Bool, animated: Bool) {
18        super.setSelected(selected, animated: animated)
19        // Configure the view for the selected state
20    }
21}

tableview 写一个通过注册 xib 来注册 cell 的扩展方法

 1import UIKit
 2
 3extension UITableView{
 4
 5    func registerNibCell(nibCellType nibCell:NibCell.Type){
 6        let nib = UINib(nibName: nibCell.nibName(), bundle: nil)
 7        self.register(nib, forCellReuseIdentifier: nibCell.identifier())
 8    }
 9
10}

这里传入了一个 NibCell.Type 的方法,这样在实际使用的时候,可以直接用对应的 nibName 获取到实际类(OrderDetailCell)定义的 nibName 方法的返回值

调用

 1import UIKit
 2
 3class MyOrderDetailViewCtl: BaseViewCtl,OrderDetailView{
 4
 5    @IBOutlet weak var tableview: UITableView!
 6
 7    override func viewDidLoad() {
 8        super.viewDidLoad()
 9        tableview.registerNibCell(nibCellType: OrderDetailCell.self)
10    }
11
12}

总结

通过封装,可以直接使用类来作为参数,后续维护时,只要看到继承 NibCell 协议的类,即可直接找到对应的方法得到 nib 名称和对应的 cell,同样注册时也不怕敲错字符串了

当然,更多的还是知道了如何使用 swift 中的将类名作为参数传递的方法