import UIKit
protocol NibLoadableView: class {}
extension NibLoadableView where Self: UIView {
static func fromNib() -> Self {
return fromNib(nibName: nil)
}
static func fromNib(nibName: String?) -> Self {
func fromNibHelper<T>(nibName: String?) -> T where T : UIView {
let bundle = Bundle(for: T.self)
let name = nibName ?? String(describing: T.self)
return bundle.loadNibNamed(name, owner: nil, options: nil)?.first as? T ?? T()
}
return fromNibHelper(nibName: nibName)
}
}
let view1 = CustomView.fromNib()
let view2: CustomView = UIView.fromNib()
let view3w = CustomView.fromNib("SomeOtherNibFileName")