[Swift] Mirror, Mirror dis moi tous ! :)
Bonjour,
Je suis en train de m'amuser avec Mirror disponible avec Swift 2.0
Qu'est ce que 'Mirror' ?
Mirror permet à partir de d'obtenir la liste des propriétés de n'importe quelles variables lors de l'exécution de l'application. C'est ce que l'on appel un mécanisme de reflection.
Quel intérêt ?
Ce mécanisme est utile quand on a besoin de mettre à jour des variables avec des donnés json par exemple. Le framework json peut ainsi établir une correspondance entre le nom des propriétés et les donnés présentent dans le json.
Voici un exemple de code qui liste les propriétés d'un objet
class Test {
var char:Character = "A"
var string:String = "My string"
var integer:Int = 100
var float:Float = 3.14
var double:Double = 6.28
var optChar:Character? = nil
var optString:String? = nil
var optInteger:Int? = nil
var optFloat:Float? = nil
var optDouble:Double? = nil
}
var lObj = Test()
var lMirror = Mirror(reflecting: lObj)
for lChild in lMirror.children {
let lLabel = lChild.label!
let lValue = lChild.value
let lType = lChild.value.dynamicType
print("\(lLabel) = \(lType):'\(lValue)'")
}
Ce code affiche dans le playground:
char = Character:'A'
string = String:'My string'
integer = Int:'100'
float = Float:'3.14'
double = Double:'6.28'
optChar = Optional<Character>:'nil'
optString = Optional<String>:'nil'
optInteger = Optional<Int>:'nil'
optFloat = Optional<Float>:'nil'
optDouble = Optional<Double>:'nil'
Si vous aussi vous avez jouer avec Mirror vous allez sans doute pouvoir m'aider.
En effet avec Mirror je n'ai réussi qu'à lister les propriétés d'un objet. Je n'ai pas trouver le moyen de faire l'équivalent du setValue:forKey: qu'on a en Objective-C.
Est ce que de votre coté vous y êtes arrivé ? Si oui comment avez vous fait ?
Une autre question que je me pose c'est comment je peux savoir avec un bout de code si le type d'une propriété est Optional ou pas ?
Voilà Si vous avez quelque pistes par rapport à mes questions dites le moi ;-)
Réponses
ça à changé sur Swift 2.0 apparemment.
Pour répondre à ta dernière question, si une propriété est optionnelle ou pas, il y a la propriété displayStyle qui est une énumération dont Optionnel est un des cas. Avant il me semble que la propriété s'appelait disposition.
Il suffit juste que tu fasses une reflection sur la valeur de ton enfant et le suivre de la propriété displayStyle afin de la comparer à une optionnelle.
Pour le setValue:forKey: je n'en sais rien. Faudrait regarder.