2016-05-28 3 views
0

Ich möchte eine automatisch generierte Kennung für jede benutzerdefinierte UITableViewCell-Unterklasse bereitstellen. Ich versuche, den folgenden Code, aber die Compiler sagtWie wird die Protokollerweiterung verwendet, um automatisch generierte Bezeichner für Klassen bereitzustellen?

Typ ‚T‘ hat kein Mitglied ‚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) 
} 

es in Ordnung, das Protokoll in einer Erweiterung für UITableViewCell zu implementieren, aber ich ziehe um es in einer Protokollerweiterung zu implementieren. Wie behebe ich das?

Antwort

3

Die generisch T in printClassName(...) weiß nicht, dass es zu AutoReusable Protokoll entspricht (auch wenn Sie als Entwickler, wissen, dass UITableViewCell tun so), es weiß nur, dass es sich um ein UITableViewCell och UITableViewCell Unterklasse-Objekt ist.

Sie könnten diese einlösen, indem ein ... where T: AutoReusable> in der generischen Typeinschränkung Hinzufügen von printClassName(...)

func printClassName<T: UITableViewCell where T: AutoReusable>(type type: T.Type) { 
    print(T.autoReuseIdentifier) 
} 

Eine gemeinsamen Umsetzung von printClassName(...) wäre jedoch AutoReusableT das Protokoll Zwang, anstatt zu lassen printClassName sein eine Funktion speziell für UITableViewCell Objekte (Unterklasse Objekte)

func printClassName<T: AutoReusable>(type type: T.Type) { 
    print(T.autoReuseIdentifier) 
} 

Diese generische Funktion kann der n kann von jedem Typ entsprechend AutoReusable aufgerufen werden, wohingegen Sie die Standardimplementierung von autoReuseIdentifier durch verschiedene Erweiterungen des Protokolls AutoReusable steuern können. Beispielsweise als vollständiges Beispiel:

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

Sie haben Recht. Vielen Dank! –

Verwandte Themen