我有一个方法,如下:
- (void) simpleMethod {
var = someValue;
}
我想定义一个仅存在于该方法中的函数(我可以在python中执行此操作)。我试着将它定义为普通的C函数,就像这样......
- (void) simpleMethod {
var = someValue;
int times1k(int theVar) {
return theVar * 1000;
}
ivar = times1k(var);
}
但Xcode会抛出各种错误。是否可以在Objective-C中的方法中定义函数?如果是这样,怎么样?
答案 0 :(得分:16)
不,Objective-C在这类事情上遵循严格的C规则,因此通常不允许嵌套函数。海湾合作委员会通过a language extension允许他们通过Joachim Bengtsson's article,但这个扩展并未转移到Clang和现代工具链。
你可以做的是使用块,这是Python(以及世界上大多数其他地方)调用闭包的Objective-C版本。由于希望保持C的超集,语法有点时髦,但你的例子是:
- (void) simpleMethod {
var = someValue;
// if you have a bunch of these, you might like to typedef
// the block type
int (^times1k)(int) = ^(int theVar){
return theVar * 1000;
};
// blocks can be called just like functions
ivar = times1k(var);
}
因为关闭而不是简单的嵌套函数,如果你希望在声明被传递时不希望它们的值被捕获,你需要遵循一些规则来声明变量,但是没有与您的示例相关的,因为您的块是纯粹的功能。另外,times1k是一个理论上可以传递的变量,遵循一些关于内存管理的不寻常规则(或者让ARC编译器为你担心它们)。
首先介绍块,我喜欢{{3}}。