> Riccardo Mottola wrote:
>>     if ([cs isKindOfClass:[NSCharacterSet class]])
>>       NSLog(@"is NSCharacterSet");
>>     if ([cs isKindOfClass:[NSMutableCharacterSet class]])
>>       NSLog(@"is NSMutableCharacterSet");
> 
> if this is a safe test - and it ought to be - then it passes also on 
> venerable 10.4. So actually it is there that the Xcode doc. lies, since it 
> returns a NSMutableCharacterSet.

Sorry, but no. Xcode doesn't "lie" here.

First of all, it's the essence of subtyping polymorphism in OO languages that 
you are free to return an object of any subclass of the method's declared 
return type. Since any NSMutableCharacterSet is also a NSCharacterSet, there is 
nothing wrong with returning a mutable character set when the method's return 
type is NSCharacterSet. The documentation also nowhere claims that any of these 
methods returns an object that is an instance of the class NSCharacterSet. (The 
old OpenStep documentation even explicitly says that these methods return an 
instance of some private subclass of NSCharacterSet.)

But anyway, the different return types do make sense here, since Apple's 
Foundation framework does remember whether you've requested a mutable or an 
immutable character set. Just try and cheat pretending the methods do actually 
return a mutable character set, e.g.,
  [(NSMutableCharacterSet *)[NSCharacterSet decimalDigitCharacterSet] 
addCharactersInString: @"abcdef"];
and see what happens. :-)

Wolfgang


Reply via email to