2017-03-24 1 views
2

Je souhaite créer un protocole qui n'est adopté que par une classe spécifique et ses sous-classes dans swift. Je sais que je peux utiliser des extensions de protocole comme celui-ciLe protocole Swift n'est implémenté que par des classes spécifiques

protocol PeopleProtocol: class { 
    } 

    extension PeopleProtocol where Self: People { 
    } 

Mais la méthode qui va aller dans mon protocole sera une méthode init qui sera mis en œuvre par une classe ou son subClasess et ne renverra que certains types d'objets spécifiques .

quelque chose comme ça.

protocol PeopleProtocol: class { 
    init() -> People 
} 

ou je peux faire quelque chose comme ça

extension PeopleProtocol where Self : People { 
    init() 
} 

Mais il y a deux problèmes,

  1. Dans la première approche si je mets une méthode d'initialisation dans le protocole, il don Ne me permettez pas de mettre une déclaration de retour là comme -> People dans la première approche. Dans la seconde approche, je dois fournir un corps de fonction dans les extensions de protocole, donc cette chose sera hors de question, car je ne sais pas quel type spécifique retourner pour cette implémentation générale.

Donc suggestions comment je peux appeler une méthode d'initialisation et faire soit:

  1. Que le protocole (pas d'extension de protocole) à mettre en œuvre que par et ses sous-classe spécifique.
  2. Ou renvoyer une instance d'un certain à partir de la méthode d'extension de protocole sans donner son corps.
+0

Fondamentalement, les méthodes 'init' n'ont aucune valeur de retour. – vadian

+0

Vrai, c'est pourquoi je veux ajouter une restriction à la première place que cette méthode ne sera implémentée que par un type de classe spécifique. – Madu

+0

désolé ne vous a pas obtenu, que faites-vous les hommes par ** utiliser 'Self 'dans le corps plutôt que la super classe le protocole est limité à **. – Madu

Répondre

1

Vous pouvez ajouter une méthode obligatoire que vous étendez uniquement aux classes appropriées.

par exemple:

protocol PeopleProtocol 
{ 
    var isPeople:Bool { get } 
    init() 
} 

extension PeopleProtocol where Self:People 
{ 
    var isPeople:Bool {return true} 
} 


class People:PeopleProtocol // this works 
{} 

class Neighbours:People // this works because People has PeopleProtocol 
{} 

class Dogs:PeopleProtocol // this will not compile 
{} 

Cela pourrait facilement être contournée par un programmeur qui voudrait, mais au moins il laissera le compilateur vous avertit si vous essayez d'appliquer le protocole à d'autres classes.

+0

Apparemment, cela résout mon problème, merci. – Madu