2010-03-17 7 views
6

Ich weiß, dass Sie Javascript, zum Beispiel Funktionen innerhalb von Funktionen unterstützt, etwa so:Unterstützt das iPhone SDK Objective C Funktionen innerhalb von Funktionen?

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 Enthält diese unterstützen? Theoretisches Beispiel:

-(void) doSomething:(id) sender{ 
    -(void) respondToEvent: (id) sender{ 
    //theoretically? ... please? 
    } 
} 

BONUS: Was ist der richtige Ausdruck für eine "lokale" Funktion?

+0

Javascript erlaubt nur das, weil es nicht wahr Klassen hat. Es ist die einzige Möglichkeit, Funktionen zu kapseln. – TechZen

Antwort

8

Der übliche Begriff ist verschachtelte Funktion. gcc unterstützt verschachtelte Funktionen als Erweiterung zu C (standardmäßig deaktiviert). Ich denke nicht, dass diese Option mit Objective-C (oder C++) mit gcc verfügbar ist, und selbst wenn es so wäre, wäre es wahrscheinlich keine gute Idee, sie zu verwenden (Portabilität usw.).

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

+0

In Obj-C Funktionen aufgerufen werden, "Methoden" Ich bin ziemlich sicher, das ist wahrscheinlich, warum er die Frage formuliert, "verschachtelte Methoden" – NpC0mpl3t3

+0

@ NpC0mpl3t3: Ich sehe nicht die Worte "geschachtelt" oder "Methode" irgendwo in Die Frage des OP? –

7

standardmäßig Xcode nicht zulässt, verschachtelte Funktionen.

Wenn Sie sie einschalten möchten, öffnen Sie die Info für Ihr Projekt, gehen Sie zur Registerkarte Erstellen und setzen Sie "Andere C-Flags" (unter dem Abschnitt "GCC 4.2 - Sprache") auf "-fnested- Funktionen ". „;‚

+0

+1 für Anweisungen zum Aktivieren – Moshe

+0

Beachten Sie, dass dies nur für C funktioniert, glaube ich - nicht Objective-C oder C++. –

+1

@Paul können Sie eine C-Funktion innerhalb einer Objective-C-Methode gut verschachteln. Sie können eine Methode nicht in eine andere Methode verschachteln, aber das ist sinnvoll. Objective-C ist eine sehr dünne Laufzeit auf Ebene C (oder C++). –

9

Ein bisschen spät, aber Sie können einen Inline-Block in eine Funktion platzieren, welche Art von wirkt wie

(Dies ist in Ihrer project.pbxproj Datei als‘OTHER_CFLAGS =“ -fnested-Funktionen gespeichert Ihre verschachtelte Funktion Fragen.

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

es ist ein bisschen chaotisch, aber es funktioniert!

0

@Moshe Sie können tatsächlich nicht die verschachtelten Funktionen innerhalb des Objective C. bieten Stattdessen können Sie die Funktion in neuester Swift 3 benutzen, die aktiviert diese Funktion wie folgt:

func someFunction(input:String)->String 
{ 
    var inputString = input; 
    func complexFunctionOnString() 
    { 
     inputString = "Hello" + input; 
    } 
    complexFunctionOnString(); 
    return inputString; 
} 
someFunction("User"); 
1

Erweitern der Antwort von Gui13 ein wenig, mit Objektparametern.

Der folgende Codeausschnitt zeigt, wie ein 11x5-Satz von UILabels gezeichnet wird. Hier

// 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]; 
    } 
} 

ist die Ausgabe für diesen Code:

code output

Verwandte Themen