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

J’ai du mal à créer une propriété d’un tableau d’entiers dans l’objective C. Je ne suis pas sûr que ce soit possible dans Obj-C, alors j’espère que quelqu’un peut m’aider à trouver comment le faire correctement ou 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 

Lorsque je construis et exécute, j’obtiens l’erreur suivante:

erreur: le type de propriété ‘doubleDigits’ ne correspond pas au type d’ivar ‘doubleDigits’

J’espère que quelqu’un pourra soit vous donner une solution, soit me diriger dans la bonne direction.

Merci d’avance.

Cela devrait fonctionner:

 @interface MyClass { int _doubleDigits[10]; } @property(readonly) int *doubleDigits; @end @implementation MyClass - (int *)doubleDigits { return _doubleDigits; } @end 

Les tableaux C ne font pas partie des types de données pris en charge pour les propriétés. Voir “Le langage de programmation Objective-C” dans la documentation Xcode, dans la page Propriétés déclarées:

Types pris en charge

Vous pouvez déclarer une propriété pour n’importe quelle classe Objective-C, type de données Core Foundation ou type «plain old data» (POD) (voir Remarque sur le langage C ++: types POD). Pour connaître les contraintes liées à l’utilisation des types de Core Foundation, voir «Core Foundation».

POD n’inclut pas les tableaux C. 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 utiliser (void *) pour contourner la vérification de type. Vous pouvez le faire, mais cela rend votre code moins maintenable.

Comme dit Lucius, il n’est pas possible d’avoir une propriété C array. Utiliser un NSArray est la voie à suivre. Un tableau stocke uniquement des objects, vous devrez donc utiliser NSNumber pour stocker vos ints. Avec la nouvelle syntaxe littérale, l’initialisation est très simple et directe:

 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: Référence de la classe NSArray , Référence de la classe NSNumber , Syntaxe littérale

Je ne fais que spéculer:

Je pense que la variable définie dans les ivars alloue l’espace juste dans l’object. Cela vous empêche de créer des accesseurs car vous ne pouvez pas atsortingbuer un tableau par valeur à une fonction mais uniquement par le biais d’un pointeur. Par conséquent, vous devez utiliser un pointeur dans les ivars:

 int *doubleDigits; 

Et puis allouer l’espace pour cela dans la méthode init:

 @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 ) * 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; 

Modifier:

Je ne sais vraiment pas si cela est permis, ces valeurs sont-elles vraiment sur la stack ou sont-elles stockées ailleurs? Ils sont probablement stockés sur la stack et ne sont donc pas sûrs à utiliser dans ce contexte. (Voir la question sur les listes d’initialisation )

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

Cela marche

 @interface RGBComponents : NSObject { float components[8]; } @property(readonly) float * components; 

 - (float *) components { return components; } 

Vous pouvez le mettre dans votre fichier .h pour votre classe et le définir en tant que propriété, dans XCode 7:

 @property int (*stuffILike) [10]; 

J’ai trouvé toutes les réponses précédentes trop compliquées. J’ai eu besoin de stocker un tableau de certains ints en tant que propriété, et j’ai trouvé que la nécessité d’ObjC d’utiliser un NSArray était une complication inutile de mon logiciel.

Donc j’ai utilisé ceci:

 typedef struct my10ints { int arr[10]; } my10ints; @interface myClasss : NSObject @property my10ints doubleDigits; @end 

Cela comstack proprement en utilisant Xcode 6.2.

Mon intention était de l’utiliser comme ceci:

 myClass obj; obj.doubleDigits.arr[0] = 4; 

Cependant, cela ne fonctionne pas. C’est ce qu’il produit:

 int i = 4; myClass obj; obj.doubleDigits.arr[0] = i; i = obj.doubleDigits.arr[0]; // i is now 0 !!! 

La seule façon de l’utiliser correctement est la suivante:

 int i = 4; myClass obj; my10ints ints; ints = obj.doubleDigits; ints.arr[0] = i; obj.doubleDigits = ints; i = obj.doubleDigits.arr[0]; // i is now 4 

et ainsi, défait complètement mon point (en évitant la complication d’utiliser un NSArray).