56 votes

Puis-je surcharger un opérateur en Objective-C ?

Est-il possible d'outrepasser l'utilisation d'un opérateur en Objective-C ?

Par exemple

myClassInstance + myClassInstance

appelle une fonction personnalisée pour ajouter les deux.

90voto

dreamlax Points 47152

La surcharge des opérateurs n'est pas une caractéristique de l'Objective-C. Si deux instances de vos classes peuvent être ajoutées l'une à l'autre, fournissez une méthode et autorisez leur ajout à l'aide de cette méthode :

Thing *result = [thingOne thingByAddingThing:thingTwo];

Ou, si votre classe est mutable :

[thingOne addThing:thingTwo];

22 votes

La concaténation des chaînes de caractères est un problème.

16voto

Vadim Shender Points 1315

Non, vous ne pouvez pas faire ça en Objective-C.

0 votes

Une raison pour cela ?

8voto

devian Points 506

Vous pouvez le faire maintenant dans Swift un successeur d'objC. Et comme Objective-C et Swift sont faits pour travailler ensemble Este pourrait être intéressant pour vous.

2 votes

Jetez un coup d'œil à la Page Swift sur le site des développeurs d'Apple. Ça dit : Swift est le successeur des langages C et Objective-C.

2 votes

Ok. Pourriez-vous nous donner un exemple concret ? Si je comprends bien, le code swift peut être inclus dans le code Objective C.

3voto

jack Points 147

Il se peut que vous souhaitiez prendre en charge l'indice pour votre objet. L'abréviation est no surcharge de l'opérateur, mais cela peut être pratique pour un objet de collection. NSArray et NSDictionary supportent tous deux l'utilisation d'indices. Par exemple :

NSMutableArray *a = [NSMutableArray new]; a[0] = @"Hello";

La façon de prendre en charge l'inscription d'un indice est de mettre en œuvre ce qui suit :

-(id)objectAtIndexedSubscript:(NSUInteger)idx; -(void)setObject:(id)newObject atIndexedSubscript:(NSUInteger)idx];

2voto

Je sais que c'est une vieille question mais je voulais juste laisser cette réponse ici pour toute personne qui voudrait savoir si c'est une possibilité.

La réponse est OUI !

Vous devrez utiliser une variante d'Objective-C appelée Objective-C++. A titre d'exemple, supposons que vous ayez créé un nouveau projet d'outil de ligne de commande en Objective-C. Afin d'autoriser les fonctionnalités C++, vous devrez renommer "main.m" en "main.mm". Ensuite, vous pourrez mélanger du code C++ avec votre code Objective-C dans le même fichier. Il y a quelques limitations, mais j'ai testé la surcharge d'opérateurs et cela semble fonctionner parfaitement avec les objets Objective-C pour autant que je puisse dire. J'ai inclus un exemple de code source pour vous donner une idée de la façon de procéder :

//main.mm
#import <Foundation/Foundation.h>
#include <iostream>
#include <string>

std::ostream &operator<<(std::ostream &os, NSString *s) {
    os << [s UTF8String];
    return os;
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        NSString *str = @"I'm an NSString!";
        std::cout << str << std::endl;

    }
    return 0;
}

Voici mon résultat après avoir construit et exécuté ce code :

I'm an NSString!
Program ended with exit code: 0

J'espère que cela sera utile à quelqu'un !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X