9
votes

Objective-C: Typedef'd un bloc, utilisé dans une déclaration de méthode. Comment puis-je implémenter cela?

J'essaie simplement d'obtenir une poignée sur des blocs. Je reçois le concept. Ils sont comme des pointeurs de fonction, mais ils sont en réalité des objets; Vous pouvez déclarer une variable de bloc et lui attribuer une valeur de bloc; appelez-le comme une fonction; ils sont "gelés dans le temps", faute d'un terme, quand ils sont exécutés, etc. J'ai créé quelques blocs et les exécuter avec succès, dans quelques formats différents, mais quand il s'agit de les utiliser dans une méthode -Ena avec un typlef ou sans - j'ai beaucoup de problèmes. Par exemple, voici une interface d'objet que j'ai créée, juste pour obtenir une poignée sur la syntaxe. Je n'ai presque aucune idée de la manière de le mettre en œuvre. XXX

Voici ce que j'ai pour une implémentation, jusqu'à présent: xxx

Je sais que je sais Je ne réponds pas encore à la variable d'instance. Encore une fois, il s'agit d'un brouillon, essayant simplement d'obtenir une poignée sur la façon dont les blocs fonctionnent. Suis-je même déclarant cette méthode juste? Je lis la programmation de l'objectif-C de Big Nerd Ranch, l'article de Mike Clark sur des blocs de Studio pragmatique et plusieurs threads. Ne peut rien trouver pertinent. Merci.

EDIT: XCode 4.3.2, si cela compte.

autre édition: OK. Utilisation d'un exemple de BJ (légèrement modifié), je pense que j'ai proposé une manière très compliquée de multiplier 5 par 3. :) xxx

Main: < pré> xxx

et la sortie est: xxx

MAINTENANT, il back 15, car le bloc que j'ai défini comme un argument n'est exécuté qu'une seule fois, droit? Il multiplie "nombre", ce qui est dans ce cas, par 3 et gèle que la réponse, non? Je suis sûr que je viens de créer une méthode complètement inutile, et je ne comprends pas encore comment utiliser les avantages / caractéristiques d'un bloc. Suis-je correct?

/ * ** * ** * ** < / em> ** * ** * ** * ** ** * ** * ** * ** * ** * * ** * ** * /

mise à jour: je comprends ce que vous dites, crd. Juste une correction, cependant, pour tous les nouveaux programmeurs qui pourraient lire ceci, obtenir une sortie différente et aller, "que?" Votre boucle pour la boucle devrait être soit: xxx

... ou ... xxx

... pour obtenir le Réponse 243.

Et oui, c'est exactement ce que j'essayais initialement de faire avec ce code. Au moins c'est ce que je pensais être censé se produire. Il s'agit de l'intention de l'auteur n'était pas de tripler un chiffre, de stocker cette valeur, triple la valeur stockée, stockez-la ... etc., mais plutôt simplement pour imprimer x * 3 pour les nombres 1-5 (3, 6, 9, 12, 15).

Voici le produit fini. Je viens de taper un bloc qui prend un INT et retourne un int, appelé tripartie. J'ai également changé le nom de l'argument de "quelqueblock" sur "Triple" pour indiquer plus clairement l'utilisation prévue du bloc. Je pense que ce sont les seules changements au code. xxx

Comme vous pouvez probablement imaginer, la sortie résultante est la suivante: xxx < p> Je faisais beaucoup plus compliqué que nécessaire. Désolé de l'avoir expliqué si mal dans l'op. Merci pour ton aide! /fil? :)


1 commentaires

Passez à travers cette explication de bloc ... Highoncoding.com/articles/...


3 Réponses :


7
votes

Appelez simplement le bloc comme une fonction C normale.

-(int)repeat:(int)howManyTimes withBlock:(triple)someBlock {
    for (int i = 0; i <= howManyTimes; i++) {
        int blockReturnValue = someBlock(i);
        // do something with blockReturnValue
    }
}


3 commentaires

D'accord. Peut-être que c'est plus simple que je ne le fais pas. Travailler sur cela maintenant.


D'accord. S'il vous plaît voir «Édition supplémentaire:« Merci pour l'aide, BJ.


Je pense avoir un QI de programmation faible, malheureusement. : P Je reçois le gist de ce qui se passe. Il devrait être plus clair, mais c'est juste la syntaxe qui me donne des crises, je suppose. C'est ce qui me tient de suivre ce qui se passe vraiment. Je vais juste ingérer autant de blocs que je peux jusqu'à ce que je vois enfin comment ils travaillent et quand les utiliser correctement. Merci beaucoup pour votre aide et votre patience.



8
votes

de lire votre question que j'ai compris, ou peut-être mal compris que votre intention était de produire le résultat de l'application de votre bloc n em> temps; par exemple. Si vous avez appliqué une fonction tripling à deux reprises, vous obtiendriez la valeur d'origine multipliée par neuf.

Juste au cas où il est utile, voici le code pour le faire: P>

AnObject *myObject = [AnObject new];

int z = [myObject repeat:5  
                     for:1 
               withBlock: ^(int number)
                          {
                             return number * 3;
                          }
        ];


2 commentaires

Merci pour la réponse, CRD. J'apprécie que vous prenez le temps. Voir la "mise à jour" ci-dessus.


@baptzmoffire - Correct, oups :-( Correction de la faute de frappe, maintenant elle produit 243!



1
votes
@import Foundation;

typedef int(^MyBlockType)(int);

@implementation NSObject(extra)
+ (int)invokeBlock:(MyBlockType)block withArgument:(int)arg
{
    return block(arg);
}
@end;

int main() {
    @autoreleasepool {
        NSLog(@"executeBlock(3) returns %d",
              [NSObject invokeBlock:^(int param) { return param * param; } withArgument:3]);
    } return 0;
}

0 commentaires