Comment rendre une classe conforme à un protocole dans Swift?

en Objective-C:

@interface CustomDataSource : NSObject  @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?

Le type ‘CellDatasDataSource’ n’est pas conforme au protocole ‘NSObjectProtocol’

Vous devez rendre votre classe héritée de NSObject pour vous conformer au NSObjectProtocol . Les classes Vanilla Swift ne le font pas. Mais de nombreuses parties d’ UIKit attendent des NSObject .

 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 requirejses du protocole.

Alors, obtenez le codage 🙂

Une classe doit hériter d’une classe parente avant d’être conforme au protocole. Il y a principalement deux manières de le faire.

Une façon consiste à faire en sorte que votre classe hérite de NSObject et soit conforme à UITableViewDataSource . Maintenant, si vous souhaitez modifier les fonctions du protocole, vous devez append le override mot clé avant l’appel de 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 } } 

Cependant, votre code est parfois désordonné car vous pouvez avoir plusieurs protocoles à respecter et chaque protocole peut avoir plusieurs fonctions de délégué. Dans cette situation, vous pouvez séparer le code conforme au protocole de la classe principale en utilisant l’ extension , et vous n’avez pas besoin d’append de mot clé de 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 } } 

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

Voici l’exemple de UITableViewDataSource :

Affiche un avertissement / un conseil pour implémenter des méthodes obligatoires:

entrer la description de l'image ici

Cliquez sur le bouton ‘Fix’, il appenda toutes les méthodes obligatoires dans le code:

entrer la description de l'image ici