[RESOLU] Cast Mutable / Immutable
Philippe49
Membre
Pour créer une NSIndexSet, je passe par un NSMutableIndexSet.
La conséquence c'est que quand je renvoie l'objet, il reste mutable.
Sans être d'un ennui considérable, j'aimerais bien faire propre, rapide et renvoyer un NSIndexSet.
Comment faire ce cast ?
Résultat :
% gcc pgm.m -o pgm -framework Foundation
pgm.m: In function ‘main':
pgm.m:27: warning: ‘NSIndexSet' may not respond to ‘-removeIndex:'
pgm.m:27: warning: (Messages without a matching method signature
pgm.m:27: warning: will be assumed to return ‘id' and accept
pgm.m:27: warning: ‘...' as arguments.)
% pgm
2008-03-19 23:34:43.089 pgm[1574:10b]
<NSMutableIndexSet: 0x1052a0>[number of indexes: 1 (in 1 ranges), indexes: (3)]
%
La conséquence c'est que quand je renvoie l'objet, il reste mutable.
Sans être d'un ennui considérable, j'aimerais bien faire propre, rapide et renvoyer un NSIndexSet.
Comment faire ce cast ?
<br />#include <Foundation/Foundation.h><br /><br />@interface NSArray (indexSetAdditions)<br />-(NSIndexSet *) indexSetOfObjects:(NSArray*) array;<br />@end<br /><br />@implementation NSArray (indexSetAdditions)<br />-(NSIndexSet *) indexSetOfObjects:(NSArray*) array<br />{<br /> NSMutableIndexSet* indexSet=[NSMutableIndexSet indexSet];<br /> for(id object in array){<br /> NSUInteger index=[self indexOfObject:object]; <br /> if(index!=NSNotFound) {<br /> [indexSet addIndex:index];<br /> }<br /> }<br /> return indexSet; <br />}<br />@end<br /><br /><br />int main(int argc, char**argv){<br /> NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];<br /> NSString * obj1=@"premier objet";NSString * obj2=@"objet 2";NSString * obj3=@"objet 3";NSString * obj4=@"objet 4";<br /> NSArray * array=[NSArray arrayWithObjects:obj1,obj2,obj3,obj4,nil] ;<br /> NSIndexSet * indexSet=[array indexSetOfObjects:[NSArray arrayWithObjects:obj2,obj4,nil]];<br /> [indexSet removeIndex:1];<br /> NSLog(@"\n%@",indexSet);<br /> [pool release];<br /> return 0;<br />}<br />
Résultat :
% gcc pgm.m -o pgm -framework Foundation
pgm.m: In function ‘main':
pgm.m:27: warning: ‘NSIndexSet' may not respond to ‘-removeIndex:'
pgm.m:27: warning: (Messages without a matching method signature
pgm.m:27: warning: will be assumed to return ‘id' and accept
pgm.m:27: warning: ‘...' as arguments.)
% pgm
2008-03-19 23:34:43.089 pgm[1574:10b]
<NSMutableIndexSet: 0x1052a0>[number of indexes: 1 (in 1 ranges), indexes: (3)]
%
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Il faut donc faire une copie :
return [[[NSIndexSet alloc] initWithIndexSet:indexSet] autorelease];
Mi si j'étais vous je ferai une simple copie. ;D
Et pourquoi ça marcherait ? Bah tout simplement parce que les classes NSIndexSet et NSMutableIndexSet implémentent à la fois les protocoles NSCopying et NSMutableCopying, ça veut dire que la méthode "copy" retourne un objet non modifiable et "mutableCopy" retourne un objet modifiable.
Donc oui, il faut en passer par "copy" :crackboom:-
Oui aussi, Â
La copie va faire la même chose que [[NSIndexSet alloc] initWithIndexSet:indexSet];
il ne me semble pas qu'on y gagne vraiment (?), mais c'est une belle réponse.
En fait ce que je cherchais, c'était de faire sans copie.
Une autre possibilité (qui ne marche pas) c'est de faire un tableau C et de construire l'index set à partir de ce tableau. Mais ça ne marche pas tout simplement parce qu'il n'y a pas de constructeurs de NSIndexSet à partir d'un tableau C.