2016-05-28 69 views
0

我想爲每個自定義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的協議,但我更喜歡在協議擴展中實現它。如何解決這個問題?

回答

3

通用TprintClassName(...)不知道它是否符合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) 
+0

你是對的。謝謝! –