Est-il possible de définir vos propres opérateurs de chemin clés, tels que @avg, @sum, etc ...Définir vos propres opérateurs de chemin clé dans le cacao
Répondre
Réponse courte: Un peu. Vous pouvez ignorer valueForKeyPath:
pour intercepter votre opérateur personnalisé ou passer à super
, mais cela peut poser problème (je laisserai l'explication à cet exercice au lecteur). Réponse longue: Oui, mais cela dépend d'un comportement privé (pas d'API privée).
Après une introspection soignée de NSArray
, j'ai trouvé des méthodes privées:
_distinctUnionOfSetsForKeyPath:
_distinctUnionOfObjectsForKeyPath:
_distinctUnionOfArraysForKeyPath:
_unionOfSetsForKeyPath:
_unionOfArraysForKeyPath:
_unionOfObjectsForKeyPath:
_minForKeyPath:
_maxForKeyPath:
_countForKeyPath:
_avgForKeyPath:
_sumForKeyPath:
Eh bien, propre! Ces méthodes semblent correspondre aux opérateurs que vous pouvez utiliser avec des collections: @sum
, @min
, @max
, @distinctUnionOfObjects
, etc. Le @
a été remplacé par un trait de soulignement et nous avons ajouté ForKeyPath:
. Il semblerait donc que nous pouvons créer une nouvelle méthode pour correspondre à la signature appropriée et nous sommes prêts à partir.
Alors:
@interface NSArray (CustomOperator)
- (id) _fooForKeyPath:(NSString *)keyPath;
@end
@implementation NSArray (CustomOperator)
- (id) _fooForKeyPath:(NSString *)keyPath {
//keyPath will be what comes after the keyPath. In this example, it will be "self"
return @"Hello world!";
}
@end
NSArray * array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];
NSLog(@"%@", [array valueForKeyPath:@"@foo.SELF"]); //logs "Hello world!"
Il fonctionne, mais je ne suis pas sûr que je me fierais à ce sujet, car il repose sur un détail de mise en œuvre qui pourrait changer à l'avenir.
Remplacer '-valueForKey:' à la place, bien que je le ferais. Lisez les documents sur la façon dont NSDictionary l'implémente. –
@Mike à long terme, il est probablement plus stable, mais le problème avec le remplacement est que ces opérateurs ne sont généralement utiles que sur les collections, et les collections de sous-classes sont un peu nulles. :( –
Belle trouvaille Dave! Cependant, il semble un bi fragile comme vous l'avez dit.Pourquoi pensez-vous que l'override valeurForKeyPath: est plus dangereux? – cfischer
Il est possible en redéfinissant valueForKeyPath:
et de faire votre propre logique personnalisée là-dedans, mais il n'y a pas de support pour cela.
- 1. Pouvez-vous définir vos propres opérateurs en F #?
- 2. Comment définir vos propres complétions d'onglet terminal
- 3. Python: faire vos propres déclarations
- 4. Création de vos propres autorisations
- 5. Rupture de vos propres exceptions dans IntelliJ
- 6. Construire vos propres contrôles Web
- 7. CodeIgniter et vos propres scripts
- 8. Comment définir mes propres opérateurs dans le langage de programmation Io?
- 9. Datamapper, définissant vos propres méthodes d'objet, comment?
- 10. Définition de vos propres macros de construction VS C++
- 11. Créer vos propres habillages d'émulateur sous Android
- 12. Possible de gérer vos propres schémas d'URL http dans iOS?
- 13. Créez vos propres tags/fonctions avec Erubis
- 14. Créer vos propres aides personnalisées avec Freemarker?
- 15. Utilisation de stringWithFormat: comme chemin de fichier dans le cacao
- 16. Plugin de base de données WordPress pour vos propres données
- 17. Définir de nouveaux opérateurs en C#?
- 18. vim ctags méthode de stocker vos propres informations
- 19. Est-il possible de créer vos propres locales personnalisées?
- 20. Plugin de validation jQuery: Comment créer vos propres messages
- 21. Est-il possible de créer vos propres paquets avec python?
- 22. Valeur clé d'observation (ala cacao) dans GWT?
- 23. définir le chemin de base dans cakephp
- 24. Définir le chemin de téléchargement
- 25. Est-il possible de créer vos propres widgets en XAML?
- 26. champ d'exception relance, la gestion de vos propres exceptions dans le code PLSQL
- 27. Cacao: Définir la couleur sélectionnée
- 28. Table Zend DB? Ou SQL par vos propres moyens?
- 29. comment définir le chemin dans ce fichier
- 30. Comment définir le chemin dans le fichier de configuration
Je dois continuer à lutter contre l'envie d'envoyer des questions de «cacao» sur le site de cuisson ... –
+1 c'est une question vraiment fascinante; Un que je n'ai jamais pensé à demander, mais celui qui a révélé des informations vraiment intéressantes. Merci d'avoir posé la question! –