我遇到了一个我不理解的有趣行为。这是产生这种行为的代码:
import UIKit
protocol UIViewNibLoading {
static var nibName: String { get }
}
extension UIView : UIViewNibLoading {
static var nibName: String {
return String(describing: self)
}
}
extension UIViewNibLoading where Self : UIView {
static func loadFromNib<T: UIViewNibLoading>() -> T {
print(T.nibName)
print(nibName)
return UINib(nibName: nibName, bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! T
// CRASH: return UINib(nibName: T.nibName, bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! T
}
}
这是执行此代码时控制台的输出:
UIView
MyCustomViewSubclass
当我在我的自定义类上调用 thenloadFromNib
方法时。它会产生两种不同的行为,具体取决于我如何获得nibName
.
- T.nibName:返回字符串
UIView
- nibName:返回字符串
MyCustomViewSubclass
你知道这里发生了什么吗?为什么在运行self
时T
不是同一个对象?这是我发现的另一件有趣的事情。当您将断点放入nibName
getter 时,您可以在调试器中看到以下内容:
这被称为:
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if section == WidgetAddTableViewController.SectionIndexRecent {
return WidgetAddHeaderView.loadFromNib()
} else if section == WidgetAddTableViewController.SectionIndexFreeAndPremium {
return WidgetAddFilterHeaderView.loadFromNib()
}
return nil
}
感谢您的任何解释。