J'ai rencontré un problème conceptuel et je recherche des conseils. J'ai une classe de base qui définit toutes les propriétés communes un type d'objet donné:Limitation du protocole Swift avec avancé
class Widget {
var id: Int
var type: String
}
Beaucoup de ces widgets partagent d'autres propriétés et capacités qui sont facilement regroupées. Les propriétés/fonctionnalités intègrent parfaitement dans les protocoles:
protocol WidgetryA {
func widgetAFunc()
}
protocol WidgetryB {
func widgetBFunc()
}
Il est facile d'étendre la classe Widget pour se conformer à ces différents protocoles:
extension Widget: WidgetryA {
func widgetAFunc() { }
}
Notez que les widgets peuvent se conformer à de multiples protocoles. Pas de problème jusqu'à présent! Ce que je voudrais faire, et ce que je lutte avec, est la suivante ... Widgets qui ont une certaine valeur Widget.type devrait essentiellement être interdit de se conformer à un protocole Widgetry donné. Ainsi, par exemple:
// this obviously doesn't work with where -- is there an alternative?
extension Widget: WidgetryA where Self.type == "foo" {
func widgetAFunc() { }
}
Maintenant, je pouvais faire quelque chose comme grossier et inélégant garde() uant dans les fonctions de protocole pour éviter Widgets du mal Widget.type de faire des appels qu'ils ne devraient pas. Je pense que les types associés pourraient fournir un chemin praticable pour atteindre ce que je veux, mais je me bats avec une construction qui fonctionne. Toute pensée ou conseil serait apprécié!
La propriété 'type' de' Widget' est une propriété stockée (et non par exemple un type associé). Si votre exemple serait légal (sous une forme quelconque), cela signifierait que les méthodes disponibles pour un _type_ donné (qui est l'essence définit le type) seraient décidées pendant _runtime_ (basé sur la _value_ d'une propriété du type), qui n'est pas possible dans le système de frappe fort de Swifts. Une utilisation courante consiste à limiter les extensions à des types où certaines typelias (le 'associatedtype') remplit certaines conditions, mais toute cette logique est résolue pendant la compilation. – dfri
Vous ne pouvez pas contraindre un protocole basé sur un attribut d'exécution. Si vous devez faire des différences typées, je recommande fortement d'utiliser des enums. – PeejWeej