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 AutoReusable
T
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)
Sie haben Recht. Vielen Dank! –