是否可以传递代码块,例如:
int i = 0;
while (i < [array count]) {
//Code to pass in here
i++;
}
原因是我需要在不同的时间对数组中的每个项执行各种操作,有一个方法并传递一段代码来运行它会很好。
答案 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)
首先,您可以提供更详细的示例。 第二,你可以看一下Action或Func,以防你需要一条回复信息(如果存在,那么等同于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
} ) ;