如何使用协议扩展为类提供自动生成的标识符?

时间:2016-05-28 13:48:02

标签: ios swift

我想为每个自定义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的扩展中实现协议是可以的,但我更喜欢在协议扩展中实现它。如何解决这个问题?

1 个答案:

答案 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