11 votes

Comment fonctionne la covariance optionnelle en Swift ?

Comment fonctionne la covariance pour Optional dans Swift ?

Disons que j'écris le code suivant :

var nativeOptionalView: Optional<UIView>
let button = UIButton()
nativeOptionalView = .Some(button)
var nativeOptionalButton = Optional.Some(button)

nativeOptionalView = nativeOptionalButton

Il compile et fonctionne très bien. Cependant, si je définis MyOptional comme

enum MyOptional<T> {
    case Some(T)
    case None
}

Et écrivez ce qui suit :

var myOptionalView: MyOptional<UIView>
let button = UIButton()
myOptionalView = .Some(button)
var myOptionalButton = MyOptional.Some(button)

myOptionalView = myOptionalButton

Je reçois l'erreur :

error : cannot assign value of type ' MyOptional<UIButton> ' pour taper ' MyOptional<UIView> '

Je comprends pourquoi cette erreur se produit avec MyOptional Ce que je ne comprends pas, c'est pourquoi cela ne se produit pas avec Optional .

4voto

fpg1503 Points 5919

Ce n'est pas le cas. Swift ne prend pas en charge les génériques covariants personnalisés pour le moment.

Le vérificateur de type de Swift est par expression, et non global (comme en Haskell). Cette tâche est géré par l'analyse sémantique dans lib/Sema . Le système de contraintes tente alors de correspondent aux types et les cas particuliers de covariance sont ensuite traités pour collections et optionnels .

Il s'agissait d'une décision de conception linguistique. Vous devriez être en mesure de faire tout ce dont vous avez besoin avec les types de collections et les optionnels intégrés. Si ce n'est pas le cas, vous devriez probablement ouvrir un radar.

0voto

daltonclaybrook Points 3944

Bien que je sois d'accord pour dire qu'il y a probablement une certaine "magie du compilateur", cela peut être accompli dans votre implémentation personnalisée en transformant le bouton en un UIView, par exemple.

var myOptionalButton = MyOptional.Some(button as UIView)

ou

var myOptionalButton: MyOptional<UIView> = .Some(button)

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