通用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
是一個函數專門用於UITableViewCell
對象(子類對象)
func printClassName<T: AutoReusable>(type type: T.Type) {
print(T.autoReuseIdentifier)
}
這個通用函數可以n可以從符合AutoReusable
的任何類型中調用,而您可以通過協議AutoReusable
的不同擴展來控制默認實現autoReuseIdentifier
。例如,作爲一個完整的例子:
protocol AutoReusable: class {
static var autoReuseIdentifier: String { get }
}
/* Default implementation */
extension AutoReusable {
static var autoReuseIdentifier: String {
return "\(self)"
}
}
/* Default implementation specifically for UITableViewCell (and subclasses) */
extension AutoReusable where Self: UITableViewCell {
static var autoReuseIdentifier: String {
return "\(self) (UITableViewCell)"
}
}
/* Generic function invokable by any class type conforming to printClassName */
func printClassName<T: AutoReusable>(type type: T.Type) {
print(T.autoReuseIdentifier)
}
/* Example setup */
extension UITableViewCell: AutoReusable { }
class Foo : AutoReusable { }
class MyCell : UITableViewCell {}
/* Example usage */
let foo = Foo()
let bar = MyCell()
printClassName(type: foo.dynamicType) // Foo
printClassName(type: bar.dynamicType) // MyCell (UITableViewCell)
你是對的。謝謝! –