Swift 2: extensión de protocolo UITableViewDataSource

He estado jugando con extensiones de protocolo y tengo un problema. Tal vez lo que quiero lograr no se puede hacer. Tengo este parque infantil:

//: Playground - noun: a place where people can play import UIKit protocol ArrayContainer { typealias T var array: [T] { get } } class MyViewController: UIViewController, ArrayContainer, UITableViewDataSource { typealias T = String var array = ["I am", "an Array"] } extension UITableViewDataSource where Self: ArrayContainer { func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return array.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // Whatever return UITableViewCell() } } 

Esto es lo que tengo y lo que quiero:

  • Tengo un protocolo ArrayContainer que solo tiene una typealias y una matriz que contiene objects de este tipo typealias
  • Tengo una extensión de protocolo de UITableViewDataSource que se utilizará cuando la class se ajusta al protocolo ArrayController . Esto simplemente devuelve el número de elementos de la matriz como número de filas. El método cellForRowAtIndexPath no está bien implementado, pero no es el problema.
  • Tengo una subclass UIViewController llamada MyViewController que implementa ambos protocolos.

El problema es que el comstackdor se queja porque MyViewController no cumple con UITableViewDataSource pero, según lo que sé, debería estar cubierto por la extensión UITableViewDataSource. ¿Me estoy perdiendo de algo? o tal vez los protocolos de Objective-C no se pueden extender?

Sé que es un poco tarde para responder, y es posible que ni siquiera esté buscando esta respuesta, pero me encontré con este problema exacto y necesitaba una "solución" de mundo real. Puede implementar los methods UITableViewDataSource en la class e inmediatamente transferir el trabajo a la extensión del protocolo como en el ejemplo a continuación. Si swift hace mejoras que ya no requieren esto, es simple volver al código en su publicación original.

 //: Playground - noun: a place where people can play import UIKit protocol ArrayContainer { associatedtype T var array: [T] { get } } class MyViewController: UIViewController, ArrayContainer, UITableViewDataSource { typealias T = String var array = ["I am", "an Array"] func numberOfSectionsInTableView(tableView: UITableView) -> Int { return self.internal_numberOfSectionsInTableView(tableView) } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.internal_tableView(tableView, numberOfRowsInSection: section) } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { return self.internal_tableView(tableView, cellForRowAtIndexPath: indexPath) } } extension UITableViewDataSource where Self: ArrayContainer { func internal_numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } func internal_tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return array.count } func internal_tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // Whatever return UITableViewCell() } }