我有一个方法,如下:
- (void) simpleMethod {
var = someValue;
}
Run Code Online (Sandbox Code Playgroud)
我想定义一个仅存在于该方法中的函数(我可以在python中执行此操作).我试着将它定义为普通的C函数,就像这样......
- (void) simpleMethod {
var = someValue;
int times1k(int theVar) {
return theVar * 1000;
}
ivar = times1k(var);
}
Run Code Online (Sandbox Code Playgroud)
但Xcode会抛出各种错误.是否可以在Objective-C中的方法中定义函数?如果是这样,怎么样?
Tom*_*mmy 16
不,Objective-C在这类事情上遵循严格的C规则,因此通常不允许嵌套函数.GCC通过语言扩展允许它们,但是这个扩展还没有被转移到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);
}
Run Code Online (Sandbox Code Playgroud)
因为这是一个闭包而不是一个简单的嵌套函数,如果你希望在声明被传递时不要在它们的值上捕获它们,你需要遵循一些规则来声明变量,但没有一个与你的例子相关,因为你的街区纯粹是功能性的.另外,times1k是一个你理论上可以传递的变量,遵循一些关于内存管理的不寻常规则(或者让ARC编译器为你担心它们).
对于块的第一次介绍,我喜欢Joachim Bengtsson的文章.