Je veux ce protocole:
protocol AddsMoreCommands {
/* ... */
}
à adopter uniquement par les classes qui héritent de la classe UIViewController
. Cette page me dit que je peux spécifier qu'elle n'est adoptée que par une classe (par opposition à une structure) en écrivant
protocol AddsMoreCommands: class {
}
mais je ne vois pas comment exiger qu'elle ne soit adoptée que par une classe particulière. Cette page parle plus tard de l'ajout de where
clauses aux extensions de protocole pour vérifier la conformité, mais je ne vois pas non plus comment l'adapter.
extension AddsMoreCommands where /* what */ {
}
Y a-t-il un moyen de faire cela? Merci!
self
au lieu deSelf
:-( Merci beaucoup, ça marche bien!AddsMoreCommands
mais une méthode à laquelle vous la transmettez attend unUIViewController
Cela peut également être réalisé sans extension:
EDITED 2017/11/04 : Comme Zig l'a souligné, cela semble générer un avertissement sur Xcode 9.1. Actuellement, il y a un problème signalé sur le projet Swift (SR-6265) pour supprimer l'avertissement, je vais garder un œil dessus et mettre à jour la réponse en conséquence.
EDITED 2018/09/29 :
class
est nécessaire si la variable qui stockera l'instance doit être faible (comme un délégué). Si vous n'avez pas besoin d'une variable faible, vous pouvez omettre leclass
et écrire simplement ce qui suit et il n'y aura aucun avertissement:la source
AnyObject
place declass
.protocol AddsMoreCommands: AnyObject where Self: UIViewController { // code }
AnyObject
En raison d'un problème dans la réponse précédente, je me suis retrouvé avec cette déclaration:
aucun avertissement dans Xcode 9.1
la source
AddsMoreCommands
àUIViewController
ce que je voulais éviter ...typealias AddsMoreCommandsViewController = UIViewController & AddsMoreCommands
Désormais, dans Swift 5, vous pouvez y parvenir en:
Très pratique.
la source