[RESOLU] Cast Mutable / Immutable

Philippe49Philippe49 Membre
mars 2008 modifié dans API AppKit #1
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 ?



<br />#include &lt;Foundation/Foundation.h&gt;<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=@&quot;premier objet&quot;;NSString * obj2=@&quot;objet 2&quot;;NSString * obj3=@&quot;objet 3&quot;;NSString * obj4=@&quot;objet 4&quot;;<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(@&quot;&#092;n%@&quot;,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)]
%


Réponses

  • schlumschlum Membre
    17:53 modifié #2
    return [NSIndexSet indexSetWithIndex:myMutableIndex];
    
  • Philippe49Philippe49 Membre
    mars 2008 modifié #3
    Oui , après réflexion, il n'est pas possible de faire un cast d'une sous-classe (NSMutableIndexSet) vers une classe parente (NSIndexSet).

    Il faut donc faire une copie :

    return [[[NSIndexSet alloc] initWithIndexSet:indexSet] autorelease];


  • schlumschlum Membre
    17:53 modifié #4
    Je préfère le constructeur de commodité... Plus lisible  :)
  • psychoh13psychoh13 Mothership Developer Membre
    17:53 modifié #5
    Oula les gars vous vous compliquez la vie là  !
    Mi si j'étais vous je ferai une simple copie. ;D

    return [[myMutableIndex copy] autorelease];
    


    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. ;)
  • schlumschlum Membre
    17:53 modifié #6
    Ah mince, je pensais que le constructeur de commodité prenait un NSIndexSet comme argument, mais en fait pas...
    Donc oui, il faut en passer par "copy"  :crackboom:-
  • Philippe49Philippe49 Membre
    mars 2008 modifié #7
    dans 1206008766:

    Oula les gars vous vous compliquez la vie là  !
    Mi si j'étais vous je ferai une simple copie. ;D

    return [[myMutableIndex copy] autorelease];
    


    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. ;)


    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.
Connectez-vous ou Inscrivez-vous pour répondre.