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:
- Escriba ''CellDatasDataSource'' no concuerda con el protocolo ''NSObjectProtocol''
- 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: