我知道javascript,例如支持函数内部的函数,如:
function doSomething(){
function doAnothingThing(){
//this function is redefined every time doSomething() is called and only exists inside doSomething()
}
//you can also stick it inside of conditions
if(yes){
function doSomethingElse(){
//this function only exists if yes is true
}
}
}
objective-c是否支持此功能?理论范例:
-(void) doSomething:(id) sender{
-(void) respondToEvent: (id) sender{
//theoretically? ... please?
}
}
奖励:“本地”功能的正确用语是什么?
答案 0 :(得分:9)
通常的术语是嵌套函数。 gcc支持嵌套函数作为C的扩展(默认情况下禁用)。我认为这个选项不适用于带有gcc的Objective-C(或C ++),即使使用它可能也不是一个好主意(可移植性等)。
答案 1 :(得分:9)
有点晚了,但你可以将一个内联块放入一个函数中,这类似于你的嵌套函数问题。
-(int)addNumbers:(int)a withB:(int)b withC:(int)c {
// inline block
int(^inlineaddNumbers)(int, int) = ^(int a, int b) {
return a + b;
};
if( a == 0 ) return inlineaddNumbers(b,c);
else return inlineaddNumbers(a,c);
}
它有点乱,但它确实有效!
答案 2 :(得分:7)
默认情况下,Xcode不允许使用嵌套函数。
如果要打开它们,请打开项目的信息,转到Build选项卡,然后将“Other C flags”(在标题为“GCC 4.2 - Language”的部分下)设置为“-fnested-functions” ”
(它存储在project.pbxproj文件中,作为“OTHER_CFLAGS =”-fnested-functions“;”
答案 3 :(得分:2)
使用对象参数扩展Gui13提供的答案。
以下代码段演示了如何绘制一组11x5 UILabel。
// inline block - to be called as a private function
UILabel *(^createLabel)(CGRect, NSString *, UIColor *) = ^UILabel *(CGRect rect, NSString *txt, UIColor *color) {
UILabel *lbl = [UILabel new];
lbl.frame = rect;
lbl.textColor = color;
lbl.backgroundColor = [UIColor whiteColor];
lbl.font = [UIFont systemFontOfSize:30.f];
lbl.textAlignment = NSTextAlignmentCenter;
lbl.text = txt;
return lbl;
};
// loop to create 11 rows of 5 columns over the whole screen
float w = CGRectGetWidth([UIScreen mainScreen].bounds);
float h = CGRectGetHeight([UIScreen mainScreen].bounds);
float top = h / 10; //start at 10% from top
float vOffset = h / 13; //space between rows: 7.6% of screen height
NSArray *xFrom, *xTo; //columns to start at 5%, 20%, 40%, 60%, 80%
xFrom = @[@(1.f/20), @(1.f/5), @(2.f/5), @(3.f/5), @(4.f/5)];
xTo = @[@(1.f/5-1.f/16), @(2.f/5-1.f/16), @(3.f/5-1.f/16), @(4.f/5-1.f/16), @(19.f/20)];
#define SFMT(format...) [NSString stringWithFormat:format]
for (int row=0; row<11; row++) {
for (int col=0; col<5; col++) {
CGRect rect = CGRectMake([xFrom[col] floatValue]*w, top+row*vOffset, [xTo[col] floatValue]*w-[xFrom[col] floatValue]*w, vOffset*0.9);
UILabel *lbl = createLabel(rect, SFMT(@"%i-%i", row, col), [UIColor blueColor]);
[<my-view> addSubview:lbl];
}
}
以下是此代码的输出:
答案 4 :(得分:0)
@Moshe您无法在Objective C中实际提供嵌套函数。相反,您可以使用最新的Swift 3中的功能来启用此功能。它将如下所示:
func someFunction(input:String)->String
{
var inputString = input;
func complexFunctionOnString()
{
inputString = "Hello" + input;
}
complexFunctionOnString();
return inputString;
}
someFunction("User");