Pourquoi le mot-clé «faible» ne peut-il être appliqué qu’aux types de protocole de classe et de classe

Lorsque je déclare des variables weak dans Swift, je reçois parfois le message d’erreur de Xcode:

“faible” ne peut être appliqué qu’à des types de protocoles liés à une classe ou à une classe

Je me demandais juste pourquoi le mot clé weak ne peut s’appliquer qu’aux types de protocoles liés aux classes et aux classes? Quelle en est la raison?

weak est un qualificatif pour les types de référence (par opposition aux types de valeur, tels que struct s et les types de valeur intégrés).

Les types de référence vous permettent d’avoir plusieurs références au même object. L’object est désalloué lorsque la dernière référence forte cesse de le référencer (les références faibles ne comptent pas).

Les types de valeur, en revanche, sont affectés par copie. Le comptage de référence ne s’applique pas, donc le modificateur weak n’a pas de sens avec eux.

Une des raisons communes de cette erreur est que vous avez déclaré votre propre protocole, mais que vous avez oublié d’hériter de NSObjectProtocol:

 protocol PenguinDelegate: NSObjectProtocol { func userDidTapThePenguin() } class MyViewController: UIViewController { weak var delegate: PenguinDelegate? } 

Le code ci-dessus vous donnera l’erreur si vous oubliez d’hériter de NSObjectProtocol . La raison étant que weak n’a de sens que pour les types de référence (classes). Donc, vous rendez le compilateur moins nerveux en indiquant clairement que le PenguinDelegate est destiné aux classes, et non aux types de valeurs.

 protocol PenguinDelegate: class { func userDidTapThePenguin() } class MyViewController: UIViewController { weak var delegate: PenguinDelegate? } 

Si vous tapez class après votre protocole, cela fonctionne aussi et semble plus approprié pour NSObjectProtocol.

Eh bien, juste au cas où quelqu’un d’autre pense que vous avez tout correct dans votre code comme moi, vérifiez que vous n’avez pas remplacé par erreur le : par un = .

Voici ce que j’ai eu Il me donnait aussi la même erreur que ci-dessus:

 protocol PenguinDelegate: class { func userDidTapThePenguin() } class MyViewController: UIViewController { weak var delegate = PenguinDelegate? } 

Mais la manière correcte est:

 protocol PenguinDelegate: class { func userDidTapThePenguin() } class MyViewController: UIViewController { weak var delegate: PenguinDelegate? } 

Voyez-vous la différence? Il m’a fallu du temps pour voir que j’avais un signe égal au lieu du côlon. Notez également que j’ai eu d’autres erreurs pour la même ligne car j’avais décidé que ma première erreur semblait être la plus susceptible de poser le véritable problème:

weak ne peut être appliqué qu’à des types de protocoles liés à une classe ou à une classe

: – <

Je trouve dans un cas où vous avez même un type de classe mais vous obtenez toujours ce message d’erreur.

Par exemple,

 class MyVC: UIViewController { var myText: UITextView = { [weak self] let text = UITextView() // some codes using self return text }() } 

Ici, un object UITextView est renvoyé d’un bloc anonyme en tant var myText de var myText . J’ai le même type de message d’erreur. Pour résoudre le problème, la var doit être marquée comme étant lazy :

 class MyVC: UIViewController { lasy var myText: UITextView = { [weak self] let text = UITextView() // some codes using self return text }() } 

weak pour ARC (comptage automatique des références). Cela signifie ne pas append le nombre de références. Donc, cela ne fonctionne que pour Class . Et dans Swift, vous obtiendrez une valeur facultative pour la sécurité.

J’ai essayé de capturer les propriétés typées Ssortingng et Array pour une fermeture. J’ai eu ces erreurs:

«faible» ne peut être appliqué qu’aux types de protocole liés à la classe et à la classe, et non à ‘[Ssortingng]’

«faible» ne peut être appliqué qu’à des types de protocoles liés à une classe ou à une classe, et non à «Ssortingng»

J’ai joué un certain temps dans la cour de récréation, et il s’est avéré que se capturer est suffisant pour ces types.

entrer la description de l'image ici J’utilisais la classe d’objective C dans swift pour un scrolView. J’ai créé IBOutlet de cette vue de défilement. Et lors de la compilation du code, cette erreur a commencé à apparaître.

Donc, pour résoudre ce type de problème, importez cette classe dans votre en-tête de pontage

importer “YourClass.h”

J’utilisais Xcode 9.2 avec swift 3.2

Juste pour info et qui n’est pas mis à jour. Après la mise en œuvre rapide de la proposition SE-0156 https://github.com/apple/swift-evolution/blob/master/proposals/0156-subclass-existentials.md , il existe dans la section Swift docs “Protocoles réservés aux classes” https : //docs.swift.org/swift-book/LanguageGuide/Protocols.html décrit maintenant pour utiliser AnyObject au lieu de la classe . Donc, il est possible que : class soit déprécié à l’avenir.