一个针对 NS(Mutable)Array 和 NS(Mutable)Dictionary 的类别,用于处理 nil 对象。
考虑以下某处定义的对象。它们可以是任何东西,包括 nil。
NSString *obj0 = @"0";
id obj1 = nil;
NSNumber *obj2 = @2;
id obj3 = nil;
// Transform them into an array. Without prior nil-checking and using old arrayWithObjects:
NSLog(@"%@", [NSArray arrayWithObjects:obj0, obj1, obj2, obj3, nil]);
> ( 0 ) // obj1 terminates the list with nil. Ouch!
// Now let's do the same using literals:
NSLog(@"%@", @[obj0, obj1, obj2, obj3]);
> CRASH // Ouch!
// Prior nil-checking would mean:
NSMutableArray *mutableArray = [NSMutableArray array];
if (obj0) [mutableArray addObject:obj0];
if (obj1) [mutableArray addObject:obj1];
if (obj2) [mutableArray addObject:obj2];
if (obj3) [mutableArray addObject:obj3];
// Or transforming nil into [NSNull null]:
mutableArray = [NSMutableArray array];
if (obj0) [mutableArray addObject:obj0]; else [mutableArray addObject:[NSNull null]];
if (obj1) [mutableArray addObject:obj1]; else [mutableArray addObject:[NSNull null]];
if (obj2) [mutableArray addObject:obj2]; else [mutableArray addObject:[NSNull null]];
if (obj3) [mutableArray addObject:obj3]; else [mutableArray addObject:[NSNull null]];
Nilus 可以用两行完成相同的工作。它可以跳过 nil 对象,或者使用 arrayWithObjectsNil
或 arrayWithObjectsNull
将它们转换为 [NSNull null]
。
id objs[] = { obj0, obj1, obj2, obj3 };
NSLog(@"%@", [NSArray arrayWithObjectsNil:objs size:sizeof(objs)]);
> ( 0, 2 )
NSLog(@"%@", [NSArray arrayWithObjectsNull:objs size:sizeof(objs)]);
> ( 0, "<null>", 2, "<null>" )
现在很容易跳过 nil 对象或为它们插入 [NSNull null]
。
id obj = ...;
[mutableArray addObjectNil:obj] // nothing will happen if obj is nil
[mutableArray addObjectNull:obj] // [NSNull null] will be added if obj is nil
适用于字典。所有方法均在“用法”部分适用。
所有方法在将对象传给默认实现之前都会执行 nil 检查。请检查 .h
文件以获取详细的文档,它也符合 Xcode 快速帮助规范。
Nil
后缀的方法将跳过对象。Null
后缀的方法将对象转换为 [NSNull null]
。以下函数和方法以 Nil
或 Null
后缀附加。
// NSArray
+ (instancetype)arrayWithObject:(id)anObject // Default
+ (instancetype)arrayWithObjectNil:(id)anObject // Nilus
+ (instancetype)arrayWithObjectNull:(id)anObject // Nilus
+ (instancetype)arrayWithObjects:(id)firstObj,,... // Default
+ (instancetype)arrayWithObjectsNil:(const id[])objects size:(size_t)size // Nilus
+ (instancetype)arrayWithObjectsNull:(const id[])objects size:(size_t)size // Nilus
- (NSArray *)arrayByAddingObject:(id)anObject // Default
- (NSArray *)arrayByAddingObjectNil:(id)anObject // Nilus
- (NSArray *)arrayByAddingObjectNull:(id)anObject // Nilus
// NSMutableArray
- (void)addObject:(id)anObject // Default
- (void)addObjectNil:(id)anObject // Nilus
- (void)addObjectNull:(id)anObject // Nilus
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index // Default
- (void)insertObjectNil:(id)anObject atIndex:(NSUInteger)index // Nilus
- (void)insertObjectNull:(id)anObject atIndex:(NSUInteger)index // Nilus
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject // Default
- (void)replaceObjectAtIndex:(NSUInteger)index withObjectNil:(id)anObject // Nilus
- (void)replaceObjectAtIndex:(NSUInteger)index withObjectNull:(id)anObject // Nilus
// NSDictionary
+ (instancetype)dictionaryWithObject:(id)anObject forKey:(id<NSCopying>)aKey // Default
+ (instancetype)dictionaryWithObjectNil:(id)anObject forKey:(id<NSCopying>)aKey // Nilus
+ (instancetype)dictionaryWithObjectNull:(id)anObject forKey:(id<NSCopying>)aKey // Nilus
+ (instancetype)dictionaryWithObjects:(const id [])objects forKeys:(const id<NSCopying> [])keys count:(NSUInteger)count // Default
+ (instancetype)dictionaryWithObjectsNil:(const id [])objects forKeys:(const id<NSCopying> [])keys count:(NSUInteger)count // Nilus
+ (instancetype)dictionaryWithObjectsNull:(const id [])objects forKeys:(const id<NSCopying> [])keys count:(NSUInteger)count // Nilus
// NSMutableDictionary
- (void)setObject:(id)anObject forKey:(id < NSCopying >)aKey // Default
- (void)setObjectNil:(id)anObject forKey:(id < NSCopying >)aKey // Nilus
- (void)setObjectNull:(id)anObject forKey:(id < NSCopying >)aKey // Nilus
使用这些方法时,您始终要知道您在做什么。错误可能会无声消失...
需要 ARC。只需在通过 pods 安装或手动安装后导入 Nilus.h
即可。
将 Classes
目录中的文件复制到您的项目中。
测试位于 NilusTests/NilusTests.m
。
The MIT License (MIT)
版权所有 (c) 2014 Masashi Beheim
特此授予任何获得此软件及其相关文档副本(以下简称“软件”)的人免费使用软件的权利,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许获得软件的人再授予前述权利,受以下条件约束:
上述版权声明和本许可声明应包含在软件的所有副本或主要内容中。
本软件按“现状”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定目的和无侵权行为的保证。在任何情况下,作者或版权所有者均不对因使用或使用本软件或其他与此软件的使用或其它交易相关的任何索赔、损害或其它责任负责,无论此类索赔、损害或其他责任是基于合同、侵权或其他法律行为而产生的。