3 ms·
I love that Objective C/Foundation provides a distinction between mutable and non-mutable collections and tends to favour the latter. (I also hate they make it
by rogerbinns 13y ago
I love that Objective C/Foundation provides a distinction between mutable and non-mutable collections and tends to favour the latter. (I also hate they make it impossible to test which a collection is.)
Pet peeve: "insure" is used on the page. For some bizarre reasons Americans use that word when they mean "ensure". The difference is very important - insure is when you don't want something to happen and ensure is when you do!
- asarazan 13y agoHah, good catch! Fixing.
- andrewroycarter 13y agoYou can test easily! [array isKindOfClass:[NSMutableArray class]] or [array respondsToSelector:@selector(insertObject:)]
- rogerbinns 13y agoHave you actually tried it? Because the people who have (me included) found that both tests will return YES, yet when you try a mutable operation you get an exception. http://stackoverflow.com/questions/1788690/objective-c-how-to-check-if-variable-is-nsarray-or-nsmutablearray http://stackoverflow.com/questions/1788690/objective-c-how-t... http://www.cocoabuilder.com/archive/cocoa/224795-nsdictionary-mutability-test.html http://www.cocoabuilder.com/archive/cocoa/224795-nsdictionar...
- blakewatters 13y agoYou cannot use `isKindOfClass:` to introspect an array like this. Most of the toll-free bridged foundation classes such as arrays/dictionaries/sets are implemented as class clusters.
- aaronbrethorst 13y agothey make it impossible to test which a collection is. Couldn't you just test with the following? // NSMutableDictionary [dict respondsToSelector:@selector(setObject:forKey:] // NSMutableArray [arr respondsToSelector:@selector(addObject:)] // NSMutableString [str respondsToSelector:@selector(replaceCharactersInRange:withString:)] // NSMutableSet [set respondsToSelector:@selector(addObject:)] Although, personally, I'd rather just, either at the class or method boundary depending on the circumstances, only expose the non-mutable variants.
- rogerbinns 13y agoNone of those work. (Try it.) The reason is that NSMutableXXXX is a wrapper around an underlying Core Foundation "object". You'll always get success from the Objective C level and then an exception when you try the action from the CF level. Example SO question: http://stackoverflow.com/questions/1788690/objective-c-how-to-check-if-variable-is-nsarray-or-nsmutablearray http://stackoverflow.com/questions/1788690/objective-c-how-t... Another example discussion: http://www.cocoabuilder.com/archive/cocoa/224795-nsdictionary-mutability-test.html http://www.cocoabuilder.com/archive/cocoa/224795-nsdictionar...