我想为每个自定义UITableViewCell子类提供自动生成的标识符。我尝试以下代码,但编译器说
键入' T'没有会员' autoReuseIdentifier'
protocol AutoReusable: class {
static var autoReuseIdentifier: String { get }
}
extension AutoReusable {
static var autoReuseIdentifier: String {
return "\(self)"
}
}
extension UITableViewCell: AutoReusable {}
func printClassName<T: UITableViewCell>(type type: T.Type) {
print(T.autoReuseIdentifier)
}
在UITableViewCell的扩展中实现协议是可以的,但我更喜欢在协议扩展中实现它。如何解决这个问题?
答案 0 :(得分:3)
T
中的通用printClassName(...)
不知道它符合AutoReusable
协议(即使您作为开发人员知道UITableViewCell
这样做了),它也是如此只知道它是UITableViewCell
och UITableViewCell
子类对象。
您可以通过在... where T: AutoReusable>
printClassName(...)
来兑换此内容
func printClassName<T: UITableViewCell where T: AutoReusable>(type type: T.Type) {
print(T.autoReuseIdentifier)
}
然而,printClassName(...)
的更常见的实现是将T
约束到协议AutoReusable
,而不是让printClassName
成为{{1}的专用函数对象(子类对象)
UITableViewCell
然后可以从符合func printClassName<T: AutoReusable>(type type: T.Type) {
print(T.autoReuseIdentifier)
}
的任何类型调用此通用函数,而您可以通过协议AutoReusable
的不同扩展来控制autoReuseIdentifier
的默认实现。例如,作为一个完整的例子:
AutoReusable