传递一段代码?

时间:2011-07-08 12:51:47

标签: iphone objective-c

是否可以传递代码块,例如:

int i = 0;
while (i < [array count]) {

//Code to pass in here
i++;
}

原因是我需要在不同的时间对数组中的每个项执行各种操作,有一个方法并传递一段代码来运行它会很好。

9 个答案:

答案 0 :(得分:7)

你考虑过使用积木吗?这只是一个想法,而不是工作或可编译的代码

typedef int (^block_t)();

-(void) methodName:(block_t) code_block
{  
   int i = 0;
   while (i < [array count]) {
   code_block() //Code to pass in here

   i++;
}

block_t youCode = ^{ NSLog("Just an example"); }
[self methodName:youCode];

答案 1 :(得分:4)

你绝对可以迭代一个数组并在其上处理block of code。自2.0以来,此功能一直是Objective C的标准部分,从4.0开始是iOS,另外还包含在Snow Leopard中。如果查找NSArray类引用,您将找到以下函数:

  

<强> enumerateObjectsAtIndexes:选择:usingBlock:   使用执行给定的块   指定数组中的对象   索引。

     

enumerateObjectsUsingBlock:执行a   使用每个对象的给定块   数组,从第一个对象开始   并继续通过阵列   最后一个对象。

     

<强> enumerateObjectsWithOptions:usingBlock:   使用每个执行给定的块   数组中的对象。

您可以在实现文件中定义要全局执行的代码块,或者在需要的位置定义代码块。你可以在这里找到一些关于块编程的好例子:http://thirdcog.eu/pwcblocks/

答案 2 :(得分:2)

听起来你想要“块”,这是Objective-C的一个特征,类似于“lambdas”,“匿名函数”和其他语言中的“闭包”。

请参阅Apple的文档:Blocks Programming Topics

答案 3 :(得分:1)

您应该将代码放入方法中并像这样调用方法:

-(void)foo{
    int i = 0;
    while (i < [array count]) {
        [self myMethod];
        i++;
    }
}
-(void)myMethod{
     //Code to pass in here
}

您还可以将方法存储为变量,允许您更改所谓的方法

SEL methodToCall = @selector(myMethod);

-(void)foo{
    int i = 0;
    while (i < [array count]){
        [self performSelector:methodToCall];
        i++;
    }
}
-(void)myMethod{
     //Code to pass in here
}

答案 4 :(得分:0)

为什么不定义执行所需功能的函数,并在不同时间使用数组中的项作为参数调用它们?

如果你担心的是你不想在这里有多个while循环的冗余代码,你可以编写一个函数,它接受一个数组和一个函数作为参数,然后将该函数应用于每个元素在阵列中。

改编自here

//------------------------------------------------------------------------------------
// 2.6 How to Pass a Function Pointer

// <pt2Func> is a pointer to a function which returns void and takes an NSObject*
void DoForAllItems( NSArray* array, void (*pt2Func)(NSObject*) )
{
    int i = 0;
    while (i < [array count]) {

        (*pt2Func)([array objectAtIndex:i]);
        i++;
    }
}

// 'DoIt' takes an NSObject*
void DoIt (NSObject* object){ NSLog(@"DoIt"); }

// execute example code
void Pass_A_Function_Pointer()
{
   NSArray* array= [NSArray arrayWithObjects:@"1", @"2", nil];
   DoForAllItems(array, &DoIt);
}

答案 5 :(得分:0)

首先,您可以提供更详细的示例。 第二,你可以看一下ActionFunc,以防你需要一条回复信息(如果存在,那么等同于obj-C)

但是,再一次,不了解你需要做什么,很难给你一个答案

由于你的原因我可以理解为@Trevor你需要运行一个方法:

int i = 0;
while (i < [array count]) {

   if (i % 2) 
       EvenMethod(array[i])
   else
       OddMethod(array[i])

i++;
}

答案 6 :(得分:0)

如果您可以使用4.0+兼容性,我强烈建议您使用块。

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block

为您提供所需的一切,您可以在需要的地方定义您的区块。还有其他一些变种。请参阅“NSArray”文档。

答案 7 :(得分:0)

http://thirdcog.eu/pwcblocks/#objcblocks

最近将块添加到Objective-C我希望他们也找到了通往Iphone的方式。 这之前也有答案: Using Objective-C Blocks

此致

答案 8 :(得分:0)

如果您使用的是Objective C ++,我强烈建议function个对象(甚至是块)。它们具有良好的语法,易于使用,并且在现代C ++编译器(MSVC ++ 11,GNUC ++ 11和LLVMC ++ 11)上随处可用:

void go( function<void (int arg)> func )
{
  int i = 0;
  while (i < [array count]) {

    //Code to pass in here
    func( i ) ; // runs func on i
    i++;
  }
}

称呼它:

go( []( int arg ){ // the square brackets are the "capture"
  printf( "arg was %d\n", arg ) ; // arg takes on whatever value was passed to it,
  // just like a normal C function
} ) ;