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

121

en el objetivo-C:

@interface CustomDataSource : NSObject <UITableViewDataSource>

@end

en Swift:

class CustomDataSource : UITableViewDataSource {

}

Sin embargo, aparecerá un mensaje de error:

  1. El tipo 'CellDatasDataSource' no se ajusta al protocolo 'NSObjectProtocol'
  2. El tipo 'CellDatasDataSource' no se ajusta al protocolo 'UITableViewDataSource'

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

YuXuan Fu
fuente
1
¿El nombre de la clase en sus mensajes de error no parece coincidir con su código proporcionado?
Matt Gibson
2
Las clases rápidas no heredan por defecto de NSObject. Son sus propias clases base a menos que se especifique lo contrario.
Tim

Respuestas:

251

El tipo 'CellDatasDataSource' no se ajusta al protocolo 'NSObjectProtocol'

Tienes que hacer que tu clase herede de NSObjectconformidad con NSObjectProtocol. Las clases de Vanilla Swift no. Pero muchas partes de UIKitesperar NSObjects.

class CustomDataSource : NSObject, UITableViewDataSource {

}

Pero esto:

El tipo 'CellDatasDataSource' no se ajusta al protocolo 'UITableViewDataSource'

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

Así que consigue la codificación :)

Alex Wayne
fuente
Gracias @Alex; me salvaste el día, ya que he estado luchando bastante tiempo para que mi clase Swift se ajuste al protocolo UICollectionViewDataSource. ¡Agregar la herencia NSObject en mi clase lo resolvió!
iOS-Coder
1
¿Soy el único que piensa que una advertencia de compilación fue suficiente?
Magoo
@Magoo Seguramente quisiste decir insuficiente. 'No se ajusta al protocolo' no significa 'heredar de NSObject' para mí.
Roy Falk
@RoyFalk Me refiero a que una advertencia de compilación fue suficiente por un error ... Es posible que no necesite implementar todo el protocolo en todos los casos y que desee construir antes de hacerlo ... no es un gran problema, pero se siente un poco innecesario .
Magoo
0

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 NSObjecty se ajuste a la clase UITableViewDataSource. Ahora, si desea modificar las funciones en el protocolo, debe agregar una palabra clave overrideantes de la llamada a la función, de esta manera

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 ensucia su código porque puede tener muchos protocolos que cumplir y cada protocolo puede tener varias funciones de delegado. En esta situación, puede separar el código conforme del protocolo de la clase principal mediante el uso extension, y no necesita agregar una overridepalabra clave en la extensión. Entonces el equivalente del 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
    }
}
Colmillo
fuente
0

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:

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

Krunal
fuente