7
votes

Est-ce que iPhone SDK Objective C est-il des fonctions de support à l'intérieur des fonctions?

Je sais que JavaScript, par exemple, prend en charge les fonctions à l'intérieur des fonctions, comme: xxx

est-ce que l'objectif-c aide-t-il? Exemple théorique: xxx

bonus: quel est le terme approprié pour une fonction "locale"?


1 commentaires

JavaScript n'autorise que cela, car il n'a pas de véritables classes. C'est le seul moyen d'encapsuler des fonctions.


5 Réponses :


9
votes

Le terme habituel est fonction imbriquée . GCC prend en charge les fonctions imbriquées comme une extension de C (désactivée par défaut). Je ne pense pas que cette option soit disponible avec Objective-C (ou C ++) avec GCC, et même si ce n'était probablement pas une bonne idée de l'utiliser (portabilité, etc.).

gcc.gnu.org/onlinedocs/gcc/nèse-fonctions.html < / a>


1 commentaires

@ NPC0MPL3T3: Je ne vois pas les mots "imbriqués" ou "méthode" n'importe où dans la question de l'OP?



8
votes

Par défaut Xcode désactive les fonctions imbriquées.

Si vous souhaitez les modifier, ouvrez les informations de votre projet, allez à l'onglet Construction et définissez "Autres drapeaux C" (dans la section intitulée "GCC 4.2 - Langue") à "-FNEST-Fonctions ".

(Ceci est stocké dans votre fichier Project.PBXProj comme "Autres_CFLAGS =" -FNEST-Fonctions ";"


2 commentaires

Notez que cela ne fonctionne que pour C, je pense - pas Objective-C ou C ++.


@Paul Vous pouvez nier une fonction C à l'intérieur d'une méthode de l'objectif-C tout simplement bien. Vous ne pouvez pas nier une méthode à l'intérieur d'une autre méthode, mais cela a du sens. Objective-C est un très mince runtime sur le dessus de la plaine C (ou C ++).



11
votes

Un peu en retard, mais vous pouvez placer un bloc inline dans une fonction, quel type d'actes comme vos questions de fonction imbriquées.

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


0 commentaires

0
votes

@moshe Vous ne pouvez pas réellement fournir les fonctions imbriquées dans l'objectif C. Au lieu de cela, vous pouvez utiliser la fonctionnalité de la dernière SWIFT 3 qui permet cette fonctionnalité. Ce sera comme ci-dessous:

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


0 commentaires