2010-03-17 20 views
6

So che javascript, ad esempio, supporta le funzioni all'interno di funzioni, in questo modo:iPhone SDK Objective C supporta le funzioni all'interno delle funzioni?

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 
    } 
    } 


} 

Vuol Objective-C supporta questo? Esempio teorico:

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

BONUS: qual è il termine corretto per una funzione "locale"?

+0

JavaScript consente solo questo perché non ha vere e proprie classi. È l'unico modo per incapsulare le funzioni. – TechZen

risposta

8

Il termine abituale è funzione nidificata. gcc supporta le funzioni annidate come estensione a C (disabilitata per impostazione predefinita). Non penso che questa opzione sia disponibile con Objective-C (o C++) con gcc, e anche se fosse probabilmente non è una buona idea usarla (portabilità, ecc.).

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

+0

In Obj-C Le funzioni sono denominate, "Metodi" Sono abbastanza sicuro, questo è probabilmente il motivo per cui ha formulato la domanda, "Metodi annidati" – NpC0mpl3t3

+0

@ NpC0mpl3t3: Non vedo le parole "nidificato" o "metodo" da nessuna parte in la domanda dell'OP? –

7

Per impostazione predefinita Xcode non consente funzioni nidificate.

Se si desidera accenderli, aprire le informazioni per il progetto, passare alla scheda Crea e impostare "Altri flag C" (nella sezione "GCC 4.2 - Language") su "-fnested- funzioni".

(Questo è memorizzato nel file project.pbxproj come "OTHER_CFLAGS = '-fnested-funzioni';"

+0

+1 per istruzioni sull'abilitazione – Moshe

+0

Si noti che questo funziona solo per C, credo, non per Objective-C o C++. –

+1

@Paul è possibile nidificare una funzione C all'interno di un metodo Objective-C. Non è possibile nidificare un metodo all'interno di un altro metodo, ma ciò ha senso. Objective-C è un runtime molto sottile in cima al semplice C (o C++). –

9

Un po 'in ritardo, ma è possibile effettuare un blocco in linea in una funzione, che tipo di atti come le vostre domande di funzione nidificate.

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

E 'un po' disordinato, ma funziona!

0

@Moshe non si può effettivamente offrire le funzioni annidate all'interno della Objective C. Invece è possibile utilizzare la funzione in ultima Swift 3 che abilita questa funzione. Sarà come di seguito:

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

Espansione della risposta fornita da Gui13 un po ', con parametri oggetto.

Il seguente frammento di codice mostra come disegnare un set 11x5 di UILabels.

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

Ecco l'output per questo codice:

code output

Problemi correlati