Créer un tableau d'entiers de la propriété en 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 d'avance.
- Est-il une raison particulière pour laquelle vous souhaitez utiliser primitive des tableaux au lieu de NSArray? Vous devez être prudent que vous ne finissent pas de réimplanter la structure de données standard des classes, à moins qu'ils ne fonctionnent pas pour vous.
- myclass.h) n'a pas besoin d'un point-virgule. Aussi, vous devriez commencer vos noms de classe avec une lettre majuscule.
- la raison en est simplement, j'ai regardé dedans, mais ne pouvait pas trouver quelque chose à construire, même à proximité. J'ai essayé un NSArray de NSNumbers, mais ne pouvait pas le comprendre. @gs : désolé, c'était une autre faute de frappe que j'ai corrigé. Aussi, je suis d'accord sur le nom de la classe; sa réalité "Fraction" dans le code réel.
Vous devez vous connecter pour publier un commentaire.
Cela devrait fonctionner:
@property(assign)
et:-(void)setDoubleDigits:(int*)doubleDigits { memcpy(_doubleDigits, doubleDigits, 10*sizeof(int)); }
sizeof(_doubleDigits)
, pas10 * sizeof(int)
, s'il vous plaît. 🙁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:
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.
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 à utiliserNSNumber
s pour stocker vos ints. Avec la nouvelle syntaxe littérale, de l'initialisation, il est très facile et simple:Ou:
Pour plus d'informations: NSArray De Référence De Classe, NSNumber De Référence De Classe, La Syntaxe Littérale
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:
Et ensuite d'allouer l'espace dans l'init-method:
Dans ce cas, l'interface ressemble à ceci:
Edit:
Je suis vraiment pas sûr qu'il est autorisé à le faire, 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)
Cela fonctionne
Vous pouvez mettre ceci dans votre .h de fichier pour votre classe et de définir la propriété, dans XCode 7:
J'ai trouvé toutes les réponses précédentes trop compliqué.
J'ai eu le besoin de stocker un tableau de certains services de renseignements comme un bien, et a trouvé l'ObjC exigence d'utilisation d'un NSArray une complication inutile de mon logiciel.
J'ai donc utilisé ce:
Cette compile proprement en utilisant Xcode 6.2.
Mon intention était de l'utiliser comme ceci:
TOUTEFOIS, cela ne fonctionne pas.
C'est ce qu'il produit:
La seule manière d'utiliser correctement est:
et donc, les défaites complètement mon point de vue (en évitant les complications de l'utilisation d'un NSArray).