我前段时间发现enum kNilOptions
等于0.我尝试使我的代码最具可读性但是我想知道当你有采用选项参数的方法时最好使用什么,例如:
[NSData dataWithContentsOfFile:imageURL.path
options:kNilOptions
error:&error];
我经常在我阅读的很多代码中看到nil
,但我认为kNilOptions
会更准确。我经常看不到(几乎没有)kNilOptions
。这有什么理由吗?
你认为使用它还是更好吗或坚持简单nil
?
我认为0
比kNilOptions
更具可读性,并且有some evidence,kNilOptions
是“老”。
您应该使用nil
来表示未初始化的Objective-C对象引用,并使用NULL
来表示未初始化的C指针(void *
,char *
等)。
如果0
没有提供“无值”,则使用options
,这是options NSDataReadingOptions
的情况。
kNilOptions
是一个古老的常数,旨在证明0
不仅仅是任何魔法零,而是代表“无选择”。在这个意义上它的使用是有效的,虽然我个人认为它在Objective-C上下文中很难看(它的大部分用法似乎都在C中),并带有k
前缀和all。在developer.apple.com上搜索options:kNilOptions
和options:0
也表明options:0
是他们的首选风格。
至于nil
,它是Objective-C等价的对象的空指针,不应该用于代表数字0
(就像这里的情况一样)。
当参数是包含其自己的“无选项”值的enum
类型时,你应该使用它,但是在NSData
的情况下,参数不是enum
而是typedef
'dNSUInteger
,并且它没有自己的“没有选项” “价值定义。
即使Apple使用它,如果您只是使用0
作为NSEnum / NSOption值,AppCode会发出警告,因为您使用的是整数而不是Enum值。
所以你需要明确地将0
强制转换为正确的枚举类型:
[NSData dataWithContentsOfFile:imageURL.path
options:(NSDataReadingOptions)0
error:&error];
或者使用kNilOptions
这是一个匿名的枚举值:
[NSData dataWithContentsOfFile:imageURL.path
options:kNilOptions
error:&error];
我建议使用后来的解决方案kNilOptions
而不是(NSDataReadingOptions)0
,以避免手动编写C-cast。
对象指针也出现了同样的问题。
你需要显式地将0
强制转换为指针:
[NSData dataWithContentsOfFile:imageURL.path
options:readOptionsMask
error:(void*)0];
或者使用nil
作为指针本身的强制转换:
[NSData dataWithContentsOfFile:imageURL.path
options:readOptionsMask
error:nil];
每个人都会推荐后来的解决方案,nil
而不是(void*)0
,以避免手动编写C-cast。
可以最终为零的各种事物用于不同的目的。不使用正确的代码可能不会影响代码,但是阅读代码的任何人都会产生怀疑,并且会因为验证代码是否有意义而陷入困境。
0
=整数零。0.0
=双精度浮点数零。'\0'
= nul char,用作C字符串的分隔符。NULL
=一个不指向任何东西的C或C ++指针。nil
=一个Objective-C对象指针,它不指向任何对象(作为一个实现细节,nil == 0
恰好评估为true,但不使用nil
而不是0
/ false
)。Nil
=一个Objective-C类指针,它不指向任何类。kNilOptions
(在这种情况下)=一个枚举常量,描述没有选项。