可以在Objective-C方法中定义C函数吗?

Rik*_*nna 2 c objective-c

我有一个方法,如下:

- (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的文章.