7

たとえば、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?
   }
}

ボーナス:「ローカル」関数の適切な用語は何ですか?

4

5 に答える 5

11

少し遅れますが、インラインブロックを関数に配置できます。これは、ネストされた関数の質問のように機能します。

-(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);   
}

少し面倒ですが、うまくいきます!

于 2014-07-02T09:54:15.417 に答える
9

通常の用語は入れ子関数です。gccは、Cの拡張機能としてネストされた関数をサポートします(デフォルトでは無効になっています)。ただし、このオプションは、gccを使用するObjective-C(またはC ++)では使用できないと思います。使用したとしても、使用するのはおそらく良い考えではありません(移植性など)。

gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html

于 2010-03-17T13:47:30.947 に答える
8

デフォルトでは、Xcodeはネストされた関数を許可しません。

それらをオンにする場合は、プロジェクトの情報を開き、[ビルド]タブに移動し、[その他のCフラグ]([GCC 4.2-言語]というタイトルのセクションの下)を[-fnested-functions]に設定します。

(これは、project.pbxprojファイルに "OTHER_CFLAGS="-fnested-functions";"として保存されます。

于 2010-03-17T13:58:11.453 に答える
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];
    }
}

このコードの出力は次のとおりです。

コード出力

于 2017-09-25T05:26:55.167 に答える
0

@Moshe Objective C内でネストされた関数を実際に提供することはできません。代わりに、この機能を有効にする最新のSwift3の機能を使用できます。以下のようになります。

func someFunction(input:String)->String
{
    var inputString = input;
    func complexFunctionOnString()
    {
        inputString = "Hello" + input;
    }
    complexFunctionOnString();
    return inputString;
}
someFunction("User");
于 2016-09-27T09:05:24.913 に答える