Objective-C中是否可以在一个函数内嵌套另一个函数?

3

Objective-C是ANSI C的超集。在GNU C中,您可以嵌套一个函数在另一个函数中......就像这样...

float E(float x)
{
    float F(float y) //objective-C compiler says expected ; at end of declaration
    {
        return x + y;
    }
    return F(3) + F(4);
}

在Objective-C中是否有这种可能?

我知道有块和NSInvocation对象,可以模拟上述C代码。但是在Objective-C中是否可以在另一个函数的词法作用域内定义一个函数?就像这样...

-(int) outer:(int)x
{
    -(int) inner:(int)y //use of undeclared identifier inner
    {
        return x * 3;
    }
    return inner(x);
}

我知道这个问题很老(OOOOooooold),但根据你的评论//objective-C compiler says expected ; at end of declaration,你只需要在内部函数定义的末尾添加一个分号(在括号后面)吗?我现在无法测试,但是当定义块并忘记在末尾放置分号时,我经常会遇到这种情况。同样的事情吗? - Mark A. Donohoe
2个回答

8
您无法做到,但您可以使用块轻松获取相同的行为。
int outer(int i)
{
    int (^inner)(int) = ^(int x)
    {
        return x * 3;
    };

    return inner(i);
}

2

由于在ObjectiveC中,方法像在C++中一样附加到类上,这意味着函数内部始终存在一个隐含的self

那么,如果有一个嵌套在另一个函数内部的函数,你该如何调用它?将其变为类方法并不是很合适。唯一的方法是将其设置为静态函数(但这似乎过于复杂)。

您应该使用blocks,它们对于C、C++和OS X上的ObjectiveC可用,或者如果您正在使用ObjectiveC ++,则可以使用类似functors的东西。


你在第一句话中混淆了术语。方法和函数是两个不同的东西。self指针仅适用于方法。Objective-C支持没有self指针的函数。当然,这些函数不与任何类绑定。我相信你知道这一点,但我想为其他人澄清这一点。 - rmaddy
它支持C函数,因为它是C的超集,但它不支持ObjectiveC函数,因为它们必须是方法。因此,ObjectiveC函数必须是方法,并且始终具有self引用。实际上,如果您尝试在类外部使用ObjectiveC语法声明函数,则会出现“缺少方法声明上下文”的错误。 - Jack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接