D'appel par défaut du protocole de mise en œuvre de méthode régulière
Je me demandais si il est possible de réaliser une telle chose.
J'ai un terrain de jeu comme ceci:
protocol Foo {
func testPrint()
}
extension Foo {
func testPrint() {
print("Protocol extension call")
}
}
struct Bar: Foo {
func testPrint() {
//Calling self or super go call default implementation
self.testPrint()
print("Call from struct")
}
}
let sth = Bar()
sth.testPrint()
Je peux fournir une implémentation par défaut dans extension
mais que faire si Bar
besoin de tout ce qui est en défaut de mise en œuvre ainsi que d'autres choses?
C'est en quelque sorte similaire à l'appel super.
méthodes de class
es pour remplir l'exigence de la mise en œuvre de chaque propriété. mais je ne vois pas de possibilité de réaliser la même chose avec structs
.
- Je voudrais utiliser
Foo.testPrint(self)()
- le problème, c'est qu'il échoue en raison d'une erreur de segmentation (testé sur deux 7.0 GM et 7.1 bêta) - C'est une étrange construction que vous avez présenté 😯
- Chaque instance est une méthode statique de la méthode en prenant un exemple comme premier paramètre
- Cependant j'ai essayé de supprimer l'extension, et il jette la même erreur de segmentation. Probablement que ça n'est pas censé travailler avec les protocoles
- Hmmm, la honte que j'ai à me répéter dans le code si cela peut être facilement résolu en utilisant l'implémentation par défaut...
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas si vous êtes toujours à la recherche d'une réponse à cette question, mais la façon de le faire est de supprimer la fonction de la définition de protocole, la fonte de votre objet à
Foo
, puis d'appeler la méthode:Pour une raison quelconque, il ne fonctionne que si la fonction n'est pas déclaré dans le cadre du protocole, mais est définie dans une extension du protocole. Aller à la figure. Mais il fonctionne.
self
àFoo
faitself
effectivement changer de type de l', parce que pour le même type d'instance, vous avez deux différentes implémentations de méthode.self
àFoo
faitself
changer son type. Il est similaire à la coulée d'un objet à partir d'une sous-classe de super-classe, puis en appelant l'un de la super-classe de méthodes. Le type réel de l'objet reste le même, mais une sous-classe a accès aux méthodes de sa super-classe par le biais de laas
de l'opérateur, même si la méthode a été remplacée. Un objet qui est conforme à un protocole d'accès au protocole de la méthode d'extension implémentations de la même manière, même si la méthode a été remplacée.(self as Foo).testPrint()
à l'extérieur deBar
mise en œuvre, à droite? Vous pouvez donc avoir accès à la super-classe (dans ce cas, par défaut de l'extension du protocole imp) la mise en œuvre de la hors de la sous-classe de mise en œuvre, c'est ce que je trouve mauvais. Dans ce casBar
montreFoo
dans le comportement, c'est faux.Foo
protocole n'héritent pas de n'importe quel autre protocole.self as Foo
), les choses se briser lors de l'exécution. Lors de la conversion vers le type de protocole, tout en conservant la méthode dans la définition de protocole (func testPrint()
), la classe de version du protocole n'a même pas appelé. Donc, vous ne savez pas si les choses de la même façon que décrit dans cette réponse, mais je pourrais faire des choses dans le mauvais sens.Eh bien, vous pourriez créer un imbriqués, conforme au protocole, l'instancier, et appeler la méthode sur celui-ci (il n'a pas d'importance que vous ne pouvez pas accéder à votre type de données que la mise en œuvre à l'intérieur de l'extension du protocole ne peut pas référencer toutes façons). Mais ce n'est pas une solution, je ferais appel élégant.
Merci pour le post! Si vous mettez la définition de la fonction dans le protocole puis, quand l'objet est répartit comme le protocole, il ne voit que l'objet de la version de la fonction et puisque vous appelez à l'intérieur de lui-même, vous obtenez la nouvelle adresse de la Pomme ...
J'ai essayé une version comme ceci:
Cela donne une puissance de:
Dans le cas où votre protocole a
associatedType
ouSelf
les exigences de la fonte ne fonctionnera pas. Pour contourner ce problème, créer une "ombre" par défaut de mise en œuvre que sur la force régulière par défaut de mise en œuvre et la mise en conformité de type peuvent appeler.que pensez-vous d'un tel moyen de corriger cela ?