2010-03-17 11 views
6

sé que el javascript, por ejemplo, soporta funciones dentro de las funciones, así:¿Admite el iPhone SDK Objective C funciones dentro de las funciones?

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


} 

¿Se Objective-C apoyar esto? Ejemplo teórico:

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

BONUS: ¿Cuál es el término adecuado para una función "local"?

+0

Javascript sólo permite esto porque no tiene clases verdaderas. Es la única forma de encapsular funciones. – TechZen

Respuesta

8

El término habitual es función anidada. gcc admite funciones anidadas como una extensión de C (desactivada por defecto). No creo que esta opción esté disponible con Objective-C (o C++) con gcc, y aunque lo fuera, probablemente no sea una buena idea usarla (portabilidad, etc.).

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

+0

En Obj-C se llaman funciones, "Métodos" Estoy bastante seguro, esa es probablemente la razón por la que formuló la pregunta, "Métodos anidados" – NpC0mpl3t3

+0

@ NpC0mpl3t3: No veo las palabras "anidado" o "método" en ninguna parte la pregunta del OP? –

7

Por defecto no permite Xcode funciones anidadas.

Si desea activarlos, abra la Información para su proyecto, vaya a la pestaña Construir y configure "Otros indicadores C" (en la sección titulada "GCC 4.2 - Idioma") en "-fnested- funciones ".

(Esto se almacena en el archivo de project.pbxproj como "OTHER_CFLAGS = '-fnested-funciones';"

+0

+1 para obtener instrucciones sobre cómo habilitar – Moshe

+0

Tenga en cuenta que esto solo funciona para C, creo, no Objective-C o C++. –

+1

@Paul puede anidar una función C dentro de un método Objective-C muy bien. No puede anidar un método dentro de otro método, pero eso tiene sentido. Objective-C es un tiempo de ejecución muy delgado en la parte superior de la llanura C (o C++). –

9

Un poco tarde, pero se puede colocar un bloque de línea en una función, qué tipo de actos como . sus preguntas función anidada

-(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 un poco complicado, pero funciona!

0

@Moshe realidad no se puede proporcionar las funciones anidadas dentro del Objetivo C. en su lugar se puede utilizar la función en última Swift 3 que habilita esta característica. Será como a continuación:

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

Ampliando un poco la respuesta proporcionada por Gui13, con los parámetros del objeto.

El siguiente fragmento de código muestra cómo dibujar un conjunto de UILabels de 11x5.

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

Aquí está la salida para este código:

code output

Cuestiones relacionadas