Question

J'aime la possibilité de sérialiser plist pour de petites collections d’objets: c’est simple, le stockage est au format XML, etc. Mais je trouve que les valeurs de réglage dans les dictionnaires sont fastidieuses:

[myDict setObject:keepThis forKey:@"ivar"];

Je préférerais de beaucoup utiliser un objet dérivé de classes (ou même simplement de structures):

myObj.ivar = keepThis

... puis envoyez un message à une collection pour obtenir un plist. Les classes / structures utilisées à cette fin pourraient être restreintes de sorte qu'elles mappent directement et facilement aux primitives de plist; Par exemple, myObj pourrait être mappé sur un NSDictionary et une exigence pourrait être imposée sur les ivars de sorte qu’ils constituent l’une des primitives de plist.

Est-ce que quelqu'un a déjà construit une installation pour cela, ou dois-je rouler moi-même?

Était-ce utile?

La solution 5

J'ai vu ceci posté ailleurs, mais c'est exactement ce que je cherchais. Les réponses ci-dessus indiquent les ingrédients bruts, mais le voici, tout est bouclé: http: // retaincount.com/blog/?p=7

Autres conseils

Je ne suis pas sûr que vous parliez bien de cela, mais Le codage de la valeur clé vous permettra, entre autres choses, de obtenir un dictionnaire avec les valeurs des données d'une instance , ainsi que définir des données d'instance à partir d'un dictionnaire .

Il existe également un moyen de demander à une instance une liste de ses attributs , bien qu'il s'avère que vous devez écrire du code vous-même pour que cela fonctionne. (Vous pouvez toutefois utiliser le l'introspection du moteur d'exécution pour l'implémenter, si vous le souhaitez.) EDIT 2 janvier 2011: - [NSObject attributeKeys] n'apparaît plus dans la documentation iOS. J'ai modifié le lien pour qu'il pointe vers la documentation Mac, mais sachez qu'il ne s'agit peut-être que d'une option sur cette plate-forme.

(Le Le protocole NSCoding est un autre moyen de laisser vos objets se stocker / restaurer eux-mêmes, mais le stockage est binaire, et non XML, et vous êtes toujours responsable d'obtenir / de mettre chaque valeur qui vous tient à coeur lorsqu'on vous le demande. par le système pour le faire.)

Vous pouvez vérifier cette question SO SO qui traite de la mise en ivars d'une instance dans un dictionnaire au moment de l'exécution.

Un projet intéressant. Le Guide de programmation Objective-C 2.0 contient une section sur les fonctions d'exécution pour obtenir dynamiquement une liste des propriétés d'une classe:

objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)

Avec cela, il devrait être assez facile d'écrire une catégorie sur NSObject avec une méthode qui extrait la liste des propriétés et les place dans un dictionnaire.

Pour utiliser les propriétés à cette fin, vous devez disposer d’un ensemble prédéfini de clés possibles. Vous ne pouvez pas utiliser de noms arbitraires avec la syntaxe à points - il doit s'agir d'une propriété connue ou d'un accesseur du premier opérande. Donc, il ne peut pas y avoir de forme générique. Mais si vous en créez un vous-même, transformer en dictionnaire est aussi simple que de faire [self dictionaryWithValuesForKeys: listOfProperties] .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top