Last active
August 29, 2015 14:21
-
-
Save cdzombak/75af914e75da85ccda1a to your computer and use it in GitHub Desktop.
NSArray thought experiment. This code may not compile and there may be subtle bugs/inconsistencies. But this serves to illustrate the possible solution outlined in https://www.dzombak.com/blog/2015/05/Cocoa-s-mutable-subclass-pattern-is-an-antipattern.html .
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@protocol NSArray | |
+ (instancetype)array; | |
+ (instancetype)arrayWithObject:(id)anObject; | |
+ (instancetype)arrayWithObjects:(const id [])objects count:(NSUInteger)cnt; | |
+ (instancetype)arrayWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION; | |
+ (instancetype)arrayWithArray:(NSArray *)array; | |
- (instancetype)initWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION; | |
- (instancetype)initWithArray:(NSArray *)array; | |
- (instancetype)initWithArray:(NSArray *)array copyItems:(BOOL)flag; | |
- (instancetype)init NS_DESIGNATED_INITIALIZER; | |
- (instancetype)initWithObjects:(const id [])objects count:(NSUInteger)cnt NS_DESIGNATED_INITIALIZER; | |
- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER; | |
@property (readonly) NSUInteger count; | |
- (id)objectAtIndex:(NSUInteger)index; | |
@property (nonatomic, readonly) id firstObject NS_AVAILABLE(10_6, 4_0); | |
@property (nonatomic, readonly) id lastObject; | |
- (instancetype)arrayByAddingObject:(id)anObject; | |
- (instancetype)arrayByAddingObjectsFromArray:(NSArray *)otherArray; | |
- (NSString *)componentsJoinedByString:(NSString *)separator; | |
- (BOOL)containsObject:(id)anObject; | |
- (id)firstObjectCommonWithArray:(NSArray *)otherArray; | |
- (void)getObjects:(id __unsafe_unretained [])objects range:(NSRange)range; | |
- (instancetype)subarrayWithRange:(NSRange)range; | |
- (NSUInteger)indexOfObject:(id)anObject; | |
- (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range; | |
- (NSUInteger)indexOfObjectIdenticalTo:(id)anObject; | |
- (NSUInteger)indexOfObjectIdenticalTo:(id)anObject inRange:(NSRange)range; | |
- (NSUInteger)indexOfObjectPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate NS_AVAILABLE(10_6, 4_0); | |
- (NSUInteger)indexOfObjectWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate NS_AVAILABLE(10_6, 4_0); | |
- (NSUInteger)indexOfObjectAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate NS_AVAILABLE(10_6, 4_0); | |
- (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate NS_AVAILABLE(10_6, 4_0); | |
- (NSIndexSet *)indexesOfObjectsWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate NS_AVAILABLE(10_6, 4_0); | |
- (NSIndexSet *)indexesOfObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate NS_AVAILABLE(10_6, 4_0); | |
@property (readonly, copy) NSString *description; | |
- (NSString *)descriptionWithLocale:(id)locale; | |
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level; | |
@property (readonly, copy) NSData *sortedArrayHint; | |
- (instancetype)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context; | |
- (instancetype)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context hint:(NSData *)hint; | |
- (instancetype)sortedArrayUsingSelector:(SEL)comparator; | |
- (instancetype)sortedArrayUsingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0); | |
- (instancetype)sortedArrayWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0); | |
@end | |
@interface NSArray : NSObject <NSCopying, NSSecureCoding, NSFastEnumeration> | |
+ (instancetype)arrayWithContentsOfFile:(NSString *)path; | |
+ (instancetype)arrayWithContentsOfURL:(NSURL *)url; | |
- (instancetype)initWithContentsOfFile:(NSString *)path; | |
- (instancetype)initWithContentsOfURL:(NSURL *)url; | |
- (NSEnumerator *)objectEnumerator; | |
- (NSEnumerator *)reverseObjectEnumerator; | |
(void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0); | |
- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0); | |
- (void)enumerateObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts usingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0); | |
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile; | |
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically; | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@interface NSMutableArray : NSObject <NSMutableCopying> | |
+ (instancetype)arrayWithCapacity:(NSUInteger)numItems; | |
- (instancetype)init NS_DESIGNATED_INITIALIZER; | |
- (instancetype)initWithCapacity:(NSUInteger)numItems NS_DESIGNATED_INITIALIZER; | |
- (void)addObject:(id)anObject; | |
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index; | |
- (void)removeLastObject; | |
- (void)removeObjectAtIndex:(NSUInteger)index; | |
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject; | |
- (void)addObjectsFromArray:(NSArray *)otherArray; | |
- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2; | |
- (void)removeAllObjects; | |
- (void)removeObject:(id)anObject inRange:(NSRange)range; | |
- (void)removeObject:(id)anObject; | |
- (void)removeObjectIdenticalTo:(id)anObject inRange:(NSRange)range; | |
- (void)removeObjectIdenticalTo:(id)anObject; | |
- (void)removeObjectsFromIndices:(NSUInteger *)indices numIndices:(NSUInteger)cnt NS_DEPRECATED(10_0, 10_6, 2_0, 4_0); | |
- (void)removeObjectsInArray:(NSArray *)otherArray; | |
- (void)removeObjectsInRange:(NSRange)range; | |
- (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray *)otherArray range:(NSRange)otherRange; | |
- (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray *)otherArray; | |
- (void)setArray:(NSArray *)otherArray; | |
- (void)sortUsingFunction:(NSInteger (*)(id, id, void *))compare context:(void *)context; | |
- (void)sortUsingSelector:(SEL)comparator; | |
- (void)insertObjects:(NSArray *)objects atIndexes:(NSIndexSet *)indexes; | |
- (void)removeObjectsAtIndexes:(NSIndexSet *)indexes; | |
- (void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withObjects:(NSArray *)objects; | |
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx NS_AVAILABLE(10_8, 6_0); | |
- (void)sortUsingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0); | |
- (void)sortWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0); | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment