62 votes

Créer un tableau de propriétés d'entiers dans Objective C

Je vais avoir des ennuis de la création d'une propriété d'un tableau d'entiers en Objective C. Je ne suis pas sûr si cela est encore possible de le faire en Obj-C, donc je suis en espérant que quelqu'un peut m'aider à trouver ni comment le faire correctement ou de fournir une solution alternative.

myclass.h

@interface myClass : NSObject {

@private int doubleDigits[10];
}

@property int doubleDigits;
@end

myclass.m

@implementation myClass

    @synthesize doubleDigits;
    -(id) init {

        self = [super init];

        int doubleDigits[10] = {1,2,3,4,5,6,7,8,9,10};

        return self;
    }

    @end

Quand je build and run, j'obtiens l'erreur suivante:

erreur: le type de la propriété 'doubleDigits' ne correspond pas à un type de ivar 'doubleDigits'

J'espère que quelqu'un peut fournir une solution ou m'orienter dans la bonne direction.

Merci à l'avance.

31voto

robottobor Points 4561

Cela devrait fonctionner:

 @interface MyClass
{
    int _doubleDigits[10]; 
}

@property(readonly) int *doubleDigits;

@end

@implementation MyClass

- (int *)doubleDigits
{
    return _doubleDigits;
}

@end
 

21voto

lucius Points 5239

C des tableaux ne sont pas pris en charge les types de données pour les propriétés. Voir "L'Objective-C, Langage de Programmation" dans Xcode de la documentation, dans la déclaration de Propriétés de la page:

Types Pris En Charge

Vous pouvez déclarer une propriété pour tout Objective-C classe de Base de la Fondation type de données, ou "plain old données" (POD) type (voir le Langage C++ Note: POD Les Types). Pour les contraintes sur l'utilisation de Base Les types de base, cependant, de voir "de Base De la fondation."

POD ne comprend pas C des tableaux. Voir http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html

Si vous avez besoin d'un tableau, vous devez utiliser NSArray ou NSData.

Les solutions de contournement, comme je le vois, sont comme de l'aide (void *) pour contourner la vérification de type. Vous pouvez le faire, mais cela rend votre code moins maintenable.

16voto

timvermeulen Points 1000

Comme lucius dit, il n'est pas possible d'avoir un C propriété de tableau. À l'aide d'un NSArray est le chemin à parcourir. Un tableau stocke uniquement des objets, de sorte que vous auriez à utiliser NSNumbers pour stocker vos ints. Avec la nouvelle syntaxe littérale, de l'initialisation, il est très facile et simple:

NSArray *doubleDigits = @[ @1, @2, @3, @4, @5, @6, @7, @8, @9, @10 ];

Ou:

NSMutableArray *doubleDigits = [NSMutableArray array];

for (int n = 1; n <= 10; n++)
    [doubleDigits addObject:@(n)];

Pour plus d'informations: NSArray Classe de Référence, NSNumber Classe de Référence, la Syntaxe Littérale

12voto

Georg Schölly Points 63123

Je suis juste spéculer:

Je pense que la variable définie dans le ivars alloue de l'espace à droite de l'objet. Cela vous empêche de créer des accesseurs parce que vous ne pouvez pas donner un tableau par valeur à une fonction, mais seulement par l'intermédiaire d'un pointeur. Par conséquent, vous devez utiliser un pointeur dans la ivars:

int *doubleDigits;

Et puis allouer de l'espace dans l'init-method:

@synthesize doubleDigits;

- (id)init {
    if (self = [super init]) {
        doubleDigits = malloc(sizeof(int) * 10);
        /*
         * This works, but is dangerous (forbidden) because bufferDoubleDigits
         * gets deleted at the end of -(id)init because it's on the stack:
         * int bufferDoubleDigits[] = {1,2,3,4,5,6,7,8,9,10};
         * [self setDoubleDigits:bufferDoubleDigits];
         *
         * If you want to be on the safe side use memcpy() (needs #include <string.h>)
         * doubleDigits = malloc(sizeof(int) * 10);
         * int bufferDoubleDigits[] = {1,2,3,4,5,6,7,8,9,10};
         * memcpy(doubleDigits, bufferDoubleDigits, sizeof(int) * 10);
         */
    }
    return self;
}

- (void)dealloc {
    free(doubleDigits);
    [super dealloc];
}

Dans ce cas, l'interface ressemble à ceci:

@interface MyClass : NSObject {
    int *doubleDigits;
}
@property int *doubleDigits;

Edit:

Je suis vraiment pas sûr qu'il est autorisé à le faire, ce sont ces valeurs vraiment sur la pile ou sont-ils stockés quelque part d'autre? Ils sont probablement stockés sur la pile et ne sont donc pas sûrs à utiliser dans ce contexte. (Voir la question sur l'initialiseur de listes)

int bufferDoubleDigits[] = {1,2,3,4,5,6,7,8,9,10};
[self setDoubleDigits:bufferDoubleDigits];

6voto

Martin West Points 51

Cela marche

 @interface RGBComponents : NSObject {

    float components[8];

}

@property(readonly) float * components;
 

 - (float *) components {
    return components;
}
 

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