Swift: casting Tout à la matrice des objets de protocole
Il y a un protocole:
protocol Valuable {
func value() -> Int
}
et une classe qui implémente le protocole:
class Value: Valuable {
private let v: Int
init(value: Int) {
v = value
}
func value() -> Int {
return v
}
}
Il y a un tableau d'objets de Valeur stockée dans une variable de n'Importe quel type:
let any: Any = [Value(value: 1), Value(value: 2), Value(value: 3)]
Il est possible de jeter Tout à [Valeur]:
let arrayOfValue = any as? [Value] // [1, 2, 3]
Pourquoi il n'est pas possible pour des cas Tout à [Précieux]?
let arrayOfValuable = any as! [Valuable] //compiler error BAD INSTRUCTION
let arrayOfValuable2 = any as? [Valuable] // nil
Vous ne pouvez pas avoir les instances d'un protocole directement, mais seulement les structures/classes qui s'y conformer.
Je ne sais pas pourquoi le casting n'est pas de travail mais peut-être déclarer comme
Je ne sais pas pourquoi le casting n'est pas de travail mais peut-être déclarer comme
[Valuable]
en premier lieu serait assez comme une solution pour vous: let any : [Valuable] = [Value(value: 1), Value(value: 2), Value(value: 3)]
OriginalL'auteur Andrii H. | 2015-09-30
Vous devez vous connecter pour publier un commentaire.
Mise à jour: Dans Swift3 il est tout à fait possible de lancer
[Any]
à un[Valuable]
. Le casting aura du succès, à condition que tous les éléments du tableau peuvent être coulé; la distribution échoue sinon.Auparavant en tant que de Swift 2: faire un
[Valuable]
d'un[Any]
cela doit être fait manuellement avec des fonctions commemap
comme d'autres réponses ont expliqué.Il n'existe actuellement aucun la covariance ni la contravariance avec les médicaments génériques en Swift (Swift 2). Cela signifie que les tableaux de différents types, comme
[String]
ou[UIView]
, ne peut pas être intégré dans les uns des autres, ni leurs types comparés.[UIView]
et[UIButton]
ours pas de hiérarchie entre les uns des autres, peu importe queUIButton
est une sous-classe deUIView
. C'est pourquoi, même si le suivant renvoie la valeur true:suivantes jette rendement des erreurs pour la même raison:
Les deux clases n'ont aucun rapport et le casting est impossible, car l'
as!
est forcé de voter pour elle estacades à l'erreur.OriginalL'auteur LopSae
Je fais un peu de creuser et que vous avez à ajouter @objc attribut comme suit
Pour plus d'informations et pour obtenir la réponse "pourquoi?": https://stackoverflow.com/a/25589323/989631
Espère que cela va vous aider.
Modifier
Plus il ne fonctionne que si vous utilisez AnyObject au lieu de 🙁
OriginalL'auteur Błażej
Ça fonctionne pour moi:
ou le même:
En conclusion,
arrayOfValuable
doit avoir le type de[Valuable]?
Edit:
Ou essayez ceci:
Sûr, la meilleure façon de le faire est de déclarer
arrayOfAny
comme[Valuable]
, de sorte que vous n'aurez pas de problèmes après.Value
dans la deuxième carte, pasValuable
, qui est ce que la question demande. Remplaceras? [Value]
avecas? [Valuable]
et vous obteneznil
, OP dit...j'ai compris après que j'ai vu la réponse exacte.
OriginalL'auteur Beraliv
Casting Tableau [] Array[String]
Conclusion:
Il est parfois utile de convertir d'un type tableau à l'autre. La meilleure approche est dans la plupart des cas, de ne pas convertir le type array, mais de faire de l'instance de contrôle avant de l'emballage de la matrice de l'instance ou de la vérification après le déballage de la matrice
OriginalL'auteur eonist