protocolos programacion orientada delegate objective-c swift

objective-c - delegate - programacion orientada a protocolos



¿Cómo hacer que una clase se ajuste a un protocolo en Swift? (3)

en Objective-C:

@interface CustomDataSource : NSObject <UITableViewDataSource> @end

en Swift:

class CustomDataSource : UITableViewDataSource { }

Sin embargo, aparecerá un mensaje de error:

  1. Escriba ''CellDatasDataSource'' no concuerda con el protocolo ''NSObjectProtocol''
  2. Escriba ''CellDatasDataSource'' no concuerda con el protocolo ''UITableViewDataSource''

¿Cuál debería ser la forma correcta?


Escriba ''CellDatasDataSource'' no concuerda con el protocolo ''NSObjectProtocol''

NSObject hacer que su clase herede de NSObject para cumplir con NSObjectProtocol . Las clases Swift de Vanilla no. Pero muchas partes de UIKit esperan NSObject s.

class CustomDataSource : NSObject, UITableViewDataSource { }

Pero esto:

Escriba ''CellDatasDataSource'' no concuerda con el protocolo ''UITableViewDataSource''

Se espera. Obtendrá el error hasta que su clase implemente todos los métodos requeridos del protocolo.

Así que obtenga la codificación :)


Una clase tiene que heredar de una clase padre antes de cumplir con el protocolo. Hay principalmente dos formas de hacerlo.

Una forma es hacer que su clase herede de NSObject y cumplir con la UITableViewDataSource juntas. Ahora, si desea modificar las funciones en el protocolo, debe agregar la override palabras clave antes de la llamada a la función, como esta

class CustomDataSource : NSObject, UITableViewDataSource { override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) // Configure the cell... return cell } }

Sin embargo, esto a veces hace que el código esté desordenado porque puede tener muchos protocolos para cumplir y cada protocolo puede tener varias funciones de delegado. En esta situación, puede separar el código conforme al protocolo de la clase principal mediante el uso de la extension , y no es necesario agregar la palabra clave override en la extensión. Entonces, el equivalente al código anterior será

class CustomDataSource : NSObject{ // Configure the object... } extension CustomDataSource: UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) // Configure the cell... return cell } }


Xcode 9, ayuda a implementar todos los métodos obligatorios de Swift Datasource & Delegates.

Aquí hay un ejemplo de UITableViewDataSource :

Muestra advertencia / sugerencia para implementar métodos obligatorios:

Haga clic en el botón ''Reparar'', agregará todos los métodos obligatorios en el código: