web-dev-qa-db-fra.com

Comment rendre une classe conforme à un protocole dans Swift?

en Objective-C:

@interface CustomDataSource : NSObject <UITableViewDataSource>

@end

à Swift:

class CustomDataSource : UITableViewDataSource {

}

Cependant, un message d'erreur apparaîtra:

  1. Le type 'CellDatasDataSource' n'est pas conforme au protocole 'NSObjectProtocol'
  2. Le type 'CellDatasDataSource' n'est pas conforme au protocole 'UITableViewDataSource'

Quelle devrait être la bonne façon?

118
YuXuan Fu

Le type 'CellDatasDataSource' n'est pas conforme au protocole 'NSObjectProtocol'

Vous devez faire hériter votre classe de NSObject pour qu'elle soit conforme à NSObjectProtocol. Les cours de Vanilla Swift ne le font pas. Mais beaucoup de parties de UIKit s'attendent à NSObjects.

class CustomDataSource : NSObject, UITableViewDataSource {

}

Mais ça:

Le type 'CellDatasDataSource' n'est pas conforme au protocole 'UITableViewDataSource'

Devrait. Vous obtiendrez l'erreur jusqu'à ce que votre classe implémente toutes les méthodes requises du protocole. 

Alors, codez :)

243
Alex Wayne

Une classe doit hériter d'une classe parent avant de se conformer au protocole. Il y a principalement deux façons de le faire.

Une solution consiste à faire en sorte que votre classe hérite de NSObject et se conforme à UITableViewDataSource ensemble. Maintenant, si vous voulez modifier les fonctions du protocole, vous devez ajouter le mot clé override avant l'appel de la fonction, comme ceci

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
    }
}

Toutefois, votre code est parfois compliqué, car vous pouvez avoir de nombreux protocoles à respecter et chaque protocole peut avoir plusieurs fonctions de délégué. Dans ce cas, vous pouvez séparer le code conforme au protocole de la classe principale à l'aide de extension et vous n'avez pas besoin d'ajouter le mot clé override dans l'extension. Donc, l'équivalent du code ci-dessus sera

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
    }
}
0
Fangming

Xcode 9 aide à implémenter toutes les méthodes obligatoires de Swift Datasource & Delegates.

Voici un exemple de UITableViewDataSource:

Affiche un avertissement/un indice pour implémenter les méthodes obligatoires:

 enter image description here

Cliquez sur le bouton 'Fix', cela ajoutera toutes les méthodes obligatoires dans le code:

 enter image description here

0
Krunal