Haga que la class rápida cumpla con el protocolo: en el nivel estático / class

Estoy intentando build una subclass genérica UITableViewController en Swift que se adapte a cualquier número de types diferentes de celdas de vista de tabla sin tener conocimiento interno de ninguna de ellas.

Para hacer esto, estoy tratando de usar protocolos para mis models y para mis celdas de vista de tabla. El protocolo para los models devolverá a qué class de celda debería ir, y el protocolo para las celdas devolverá respuestas a preguntas como cuál debería ser la altura de la celda para un model dado.

Pero tengo un problema para que los protocolos funcionen, porque con el segundo protocolo quiero ir a la class de la celda en lugar de a su instancia.

El protocolo para los models es el siguiente:

protocol JBSTableItemDelegate { func tableCellDelegate() -> JBSTableViewCellInterface } 

El protocolo para las celdas es el siguiente:

 protocol JBSTableViewCellInterface: class { static func registerNibsWithTableView(tableView: UITableView) static func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath?, tableItem: JBSTableItemDelegate) -> CGFloat static func tableView(tableView: UITableView, dequeueReusableCellWithIndexPath indexPath: NSIndexPath, tableItem: JBSTableItemDelegate, delegate: AnyObject) -> JBSTableViewCell } 

Observe el uso de la palabra key "static". Estos methods son methods de class en las subclasss UITableViewCell, y agregar estática parece ser lo que necesito hacer para verificar que estas classs se conforman, o eso lo entiendo.

Cuando uso el primer protocolo, el código se parece así, y comstack:

 let tableViewCellInterface = tableItem!.tableViewCellInterface() 

Llama a este método (como un ejemplo):

 func tableViewCellInterface() -> JBSTableViewCellInterface { return JBSLiteratureTableViewCell.self as! JBSTableViewCellInterface } 

Esto devuelve la class de la celda, como, "JBSLiteratureTableViewCell.self"

Cuando uso el segundo protocolo, el código se ve así, y no comstack:

 returnFloat = tableViewCellInterface.tableView(tableView, heightForRowAtIndexPath: indexPath, tableItem: tableItem!) 

No se puede comstackr debido a la palabra key estática arriba anterior, y el error del comstackdor que obtengo es:

'JBSTableViewCellInterface' no tiene un miembro llamado 'tableView'

Si elimino las palabras key estáticas de los funcs de protocolo, comstack, pero luego las subclasss UITableViewCell se quejan diciendo:

'JBSLiteratureTableViewCell' no cumple con el protocolo 'JBSTableViewCellInterface'

Esto se debe a que ahora están tratando de asegurarse de que existan methods de instancia, que no es donde están.

¿Cómo hago que una class rápida se ajuste a un protocolo a nivel de class, por lo que puede ser mi delegado en lugar de alguna instancia de una class? Estoy seguro de que podría sortear esto creando classs de ayuda del protocolo JBSTableViewCellInterface que son singletons y permítales hacer el trabajo, pero prefiero crearlo directamente en las subclasss UITableViewCell en sus methods de class.

ACTUALIZADO para Swift versión 2.0 y superior

Según la respuesta de Gregzo, Swift 2.0+ permite que los methods se declaren como estáticos en la definición del protocolo. Estos deben satisfacerse con los methods estáticos / de class en los objects que implementan el protocolo.

No puede satisfacer una definición de protocolo para un método de instancia con un método estático o viceversa, lo que hace que esta sea una respuesta incompleta para la pregunta anterior.

Si desea probar esto, use la palabra key "estática" en la definición de protocolo para los methods que implementará como methods estáticos o de class en sus objects conformes:

 protocol InstanceVsStatic { func someInstanceFunc() static func someStaticFunc() } enum MyConformingEnum: InstanceVsStatic { case someCase static func someStaticFunc() { // code } func someInstanceFunc() { // code } } class MyConformingClass: InstanceVsStatic { class func someStaticFunc() { // code } func someInstanceFunc() { // code } } struct MyConformingStruct: InstanceVsStatic { static func someStaticFunc() { // code } func someInstanceFunc() { // code } } 

Puede hacer que un método de instancia llame a un método estático / class:

Esto le permite ejecutar código estático cuando necesita adaptarse a un protocolo que requiere un método de instancia.

 struct MyConformingStruct: InstanceVsStatic { static func doStuffStatically(){ // code } static func someStaticFunc() { // code } func someInstanceFunc() { MyConformingStruct.doStuffStatically() } } 

Swift 1.2

Además de indirectamente como se indicó anteriormente, no hay forma de utilizar methods estáticos (class) para cumplir con un protocolo en la versión 1.2 y siguientes de Pure Swift. Es una característica conocida de error / no implementado: https://openradar.appspot.com/20119848

Si un protocolo funcional es estático, el implementador debe implementarlo como un método estático, y si no lo está, como método de instancia:

 protocol MixedProtocol { static func staticFoo() func instanceBar() } class ExampleClass : MixedProtocol { // implementing static func as class func is fine. // class funcs are overridable, not static ones class func staticFoo() { println( "I'm a class func" ) } func instanceBar() { println( "I'm an instance func" ) } } 

No hay una forma directa a su alnetworkingedor: conformarse a un protocolo significa exactamente eso, y 'estático' es una característica key de una statement de miembro del protocolo que los implementadores deben respetar.