Hacker News new | ask | show | jobs
by rogerbinns 4778 days 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!

3 comments

You can test easily! [array isKindOfClass:[NSMutableArray class]] or [array respondsToSelector:@selector(insertObject:)]
Have 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-t...

http://www.cocoabuilder.com/archive/cocoa/224795-nsdictionar...

You 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.

    they 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.
None 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-t...

Another example discussion: http://www.cocoabuilder.com/archive/cocoa/224795-nsdictionar...

Hah, good catch! Fixing.