Retourner plusieurs valeurs à partir d'une méthode Objective-C
J'ai posé une question similaire, mais je ne pouvais pas le faire exactement. Je suis en train de construire une application iPhone, et il y a une méthode que je veux appelée à partir de différents fichiers. J'ai pensé que le plus simple serait tout simplement de faire une méthode dans un autre fichier, et d'appeler la méthode à partir d'autres fichiers.
Voici quelques problèmes. J'ai besoin de retourner plusieurs valeurs à partir de la méthode, après le passage de plusieurs valeurs. Par exemple, je suis le passant: (int, int, int, string, string)
. Et il a besoin de retourner toutes ces valeurs, après qu'ils ont été modifiés. Quelqu'un m'a montré ce code:
- (NSDictionary *)EndOfTurn:(int)varTurns withFatness:(int)varFatness
{
varTurns--;
if (varTurns <= 0) {
varFatness = varFatness - 5;
}
else {
varFatness += 2;
}
return [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:varFatness], @"FATNESS", [NSNumber numberWithInt:varTurns], @"TURNS", nil];
}
Toutefois, ce code ne fonctionne pas, et j'ai besoin de quelques informations pour vraiment le comprendre. Disons que je suis de passage, ces valeurs:
int varMoney;
int varNumSheep;
int varNumShepherds;
NSString *test1;
NSString *test2;
J'ai donc besoin d'obtenir l'ensemble de ces valeurs de retour de la méthode.
Comment dois-je le déclarer dans le fichier d'en-tête? Cela devrait être un Objectif-C fichier, mais pourriez-vous me donner le code pour la totalité du fichier pour que je puisse voir où il serait aller avec le @implementation
et @end
, que sais-je encore. Aussi, comment pourrais-je appeler cette méthode?
- Je tiens à souligner que "withFatness' est génial d'une fonction.
- vous aurez également besoin de conserver le résultat de cette fonction. Parce que le dictionnaire que vous êtes de retour est à partir d'une méthode de convenance, il est autoreleased, et disparaîtra peu de temps si pas conservé. c'est à dire lorsque vous l'appelez-vous feriez quelque chose comme ceci: NSDictionary *myDic = [self EndOfTurn:tourne withFatness:gras]; [myDic retain];
- et puis [myDic release]; lorsque vous êtes bon et fait avec elle.
- Je ressens cette envie de marquer votre variable convention de nommage. 🙂
Vous devez vous connecter pour publier un commentaire.
Puisque vous ne pouvez retourner une seule valeur à partir d'une méthode en C et C-langages dérivés, il vous suffit de retourner une valeur unique qui représente l'ensemble de vos autres valeurs. C'est ce que votre exemple de code fait avec un
NSDictionary
.L'exemple de code est correct, même si c'est un peu contraire à l'Objectif commun-C style.
Ce que vous déclarez dans le fichier d'en-tête est tout simplement la déclaration de la méthode, c'est:
Dans le fichier source, puis:
Qu'en passant dans les valeurs des pointeurs?
Par exemple:
Ensuite, vous pouvez l'appeler comme:
Edit:
Cela fonctionne aussi bien avec des objets. Vous verrez souvent cette habitude lorsque vous traitez avec
NSError
objets:Peut être mis en œuvre:
NSJSONSerialization
'sJSONObjectWithData
de la fonction.Si vous avez beaucoup de choses différentes qui doivent être renvoyées à partir d'une méthode, soit l'encapsuler dans un NSDictionary comme d'autres l'ont suggéré, ou simplement la définition d'une classe. Vous pouvez déclarer les variables d'instance et les propriétés à encapsuler les données, en tant que de besoin.
La définition d'une classe d'encapsuler ces informations s'avère tout à fait efficace et maximise la souplesse. Si vous avez besoin de revoir votre application, tels que la collecte de données gains de nouveaux champs, doit être sauvegardés pour plus tard, ou peut-être besoin de gain de fonctionnalité, une classe de faciliter ces changements.
Vous pouvez utiliser un bloc de fermeture à renvoyer plusieurs valeurs à partir d'une méthode de ce genre. -rrh
Résultats:
Deux valeurs retournées, int-fruitCount:2, NSString-fruiteString:Vous disposez d'apple sur votre liste à de nombreuses reprises:2
Si vous avez seulement besoin de retourner des valeurs primitives, puis en la retournant une structure peut être la solution optimale. Vous obtenez au moment de la compilation de vérification d'erreur (par exemple, par opposition à un NSDictionary où vous pouvez tenter de lire une clé non valide), bien que ne nécessitant pas tout le code/les fichiers impliqués dans la création d'une classe.
Apple utilise des structures dans de nombreux de leurs méthodes (par exemple CGPoint, CGRect).
La raison pour laquelle cela ne fonctionne pas avec les objets, c'est parce que ARC interdit cette.
Une légère amélioration pour le dernier point, dans certains modèles est d'utiliser une structure de holding enum membres. Cela vous donne le temps de compilation de vérification déjà mentionné, quelque chose qui ressemble à un objet dans la valeur de retour, et l'avantage de clarifier les cas si vous avez besoin de vérifier les valeurs de retour.
La structure:
Le code de client: