46 votes

rapide devrais-je utiliser le protocole ou le protocole: classe

J'ai installé un protocole pour renvoyer des informations au VC précédent.

Je le définis comme ceci:

 protocol FilterViewControllerDelegate: class  {
    func didSearch(Parameters:[String: String]?)
}
 

Mais quelle est la différence lors de l'utilisation:

 protocol FilterViewControllerDelegate  {
        func didSearch(Parameters:[String: String]?)
    }
 

Et quand dois-je utiliser un protocole : class ?

63voto

appzYourLife Points 10219

Swift 4 version

AnyObject ajouté à une définition de protocole comme ceci

protocol FilterViewControllerDelegate: AnyObject  {
    func didSearch(parameters:[String: String]?)
}

signifie qu'une classe sera en mesure de se conformer à ce protocole.

Alors au vu de cette

protocol FilterViewControllerDelegate: AnyObject  {
    func didSearch(parameters:[String: String]?)
}

Vous serez en mesure d'écrire ce

class Foo: FilterViewControllerDelegate {
    func didSearch(parameters:[String: String]?) { }
}

mais PAS ce

struct Foo: FilterViewControllerDelegate {
    func didSearch(parameters:[String: String]?) { }
}

Swift 3 version

:class ajouté à une définition de protocole comme ceci

protocol FilterViewControllerDelegate: class  {
    func didSearch(Parameters:[String: String]?)
}

signifie qu'une classe sera en mesure de se conformer à ce protocole.

Alors au vu de cette

protocol FilterViewControllerDelegate: class  {
    func didSearch(Parameters:[String: String]?)
}

Vous serez en mesure d'écrire ce

class Foo: FilterViewControllerDelegate {
    func didSearch(Parameters:[String: String]?) { }
}

mais PAS ce

struct Foo: FilterViewControllerDelegate {
    func didSearch(Parameters:[String: String]?) { }
}

27voto

kokojambo1997 Points 131

Il y a aussi une autre chose à propos de marquage des protocoles avec la "classe" mot-clé.

Donc, c'est votre protocole:

protocol FilterViewControllerDelegate: class  {
    func didSearch(Parameters:[String: String]?)
}

Par exemple, supposons que vous êtes en train de créer un DetailVC, qui dispose d'un délégué de la propriété:

class DetailViewController: UISomeViewController {
    weak var delegate: FilterViewControllerDelegate
}

Si vous n'avez pas la marque de ce protocole avec "classe" mot-clé, vous aussi ne pas être en mesure de marquer que de "délégué" de la propriété comme un "faible" un.

Pourquoi?

C'est simple salle de classe en fonction des propriétés peuvent être la faiblesse des relations. Si vous êtes en essayant d'éviter un cycle de référence, qui est le chemin à parcourir

11voto

swift2geek Points 695

Swift 4.1, Xcode 9.3 syntaxe:

protocol FilterViewControllerDelegate: AnyObject {
       func didSearch(Parameters:[String: String]?)
}

ce protocole peut être adopté que par les classes.

Pour répondre à votre première question -

Mais quelle est la différence lors de l'utilisation:

la différence de celle-ci:

protocol FilterViewControllerDelegate  {
        func didSearch(Parameters:[String: String]?)
}

c'est que ce protocole peut adopter des types de valeur, tels les énumérations et les structures ainsi.

Pour répondre à votre deuxième question -

Et quand dois-je utiliser un : classe de protocole?

lorsque vous devez utiliser la classe de protocole, je voudrais décrire suivant l'exemple de modèle de délégué: Imaginez que vous avez délégué protocole.

protocol PopupDelegate: AnyObject {
    func popupValueSelected(value: String)
}

et dans une autre catégorie que vous voulez pour créer une propriété

var delegate: PopupDelegate?

Mais cela a une forte référence qui pourrait vous amener à des problèmes avec des fuites de mémoire. Une façon de réparer fuite de mémoire est à rendre délégué de la propriété - faible. Jusqu'à ce que nous ne ferons pas notre seul protocole disponible à appliquer pour les classes, Swift pense que l'on pourrait appliquer notre protocole de types de valeur.

weak var delegate: PopupDelegate?

Si vous essayez de déclarer votre délégué comme faible, vous verrez erreur suivante:

"faible" var uniquement être appliquée à la classe et de classe lié aux types de protocole, pas 'PopupDelegate'

Mais nous ne pouvons pas appliquer faible pour les types de valeur. Nous avons donc besoin de restreindre notre protocole à un type de référence, de sorte swift sait que c'est un type de référence. Pour vous rendre disponible pour déclarer ce délégué faible, vous devez restreindre votre protocole pour être utilisé par les classes seulement:

protocol PopupDelegate: AnyObject {
    func popupValueSelected(value: String)
}

6voto

alex Points 150

Cela signifie que le protocole que vous définissez peut être adopté que par les classes, pas de structures ou d'énumérations.

De Swift Officiel du livre:

protocol SomeClassOnlyProtocol: class, SomeInheritedProtocol {
    // class-only protocol definition goes here } 

Dans l'exemple ci-dessus, SomeClassOnlyProtocol ne peuvent être adoptés que par les types de classe. Il est une erreur de compilation d'écrire une structure ou d'une énumération définition qui tente d'adopter SomeClassOnlyProtocol.

1voto

J.beenie Points 450

Mise à jour Swift 3.2:

Pour déclarer le protocole de classe uniquement, écrivez maintenant:

 protocol SomeClassOnlyProtocol: AnyObject, SomeInheritedProtocol {
    // class-only protocol definition goes here
}
 

au lieu de

 protocol SomeClassOnlyProtocol: class, SomeInheritedProtocol {
    // class-only protocol definition goes here
}
 

Le deuxième extrait semble toujours fonctionner pour l'instant. Référence: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X