en Objective-C:
@interface CustomDataSource : NSObject <UITableViewDataSource>
@end
à Swift:
class CustomDataSource : UITableViewDataSource {
}
Cependant, un message d'erreur apparaîtra:
Quelle devrait être la bonne façon?
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 à NSObject
s.
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 :)
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
}
}
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:
Cliquez sur le bouton 'Fix', cela ajoutera toutes les méthodes obligatoires dans le code: