swift的extension很好用,可以为现有的类、结构体、枚举添加方法,也可以结合协议扩展来添加方法,如下代码所示,
1. 常见的添加方式
import UIKit
extension UIView {
static func loadFromNib(nibName: String) -> UIView? {
let view = Bundle.main.loadNibNamed(nibName, owner: nil, options: nil)?.first as! UIView
return view
}
}
2. 通过协议扩展的方式
protocol Nibloadable {}
extension Nibloadable where Self: UIView {
static func loadFromNib(nibName: String?) -> Self {
return Bundle.main.loadNibNamed(nibName ?? "\(self)", owner: nil, options: nil)?.first as! Self
}
}
3. 两种方式对比
第一种方式,是为所有的UIView及其子类都添加loadFromNib(nibName) -> UIView
方法,这在开发过程中会引起一些歧义,因为Xcode自动补全的功能,其他的调用者会看到这样一个额外的方法,这可能会让调用者赶到疑惑。
第二种方式,是通过协议扩展的方式,并且该一些还通过类型约束的方式,限制了只有UIView的子类才能实现该协议。
所以笔者更加推荐第二种方式。