如何以良好的实践方式避免转换标志(不铸造)?

时间:2014-03-22 16:27:01

标签: objective-c type-conversion long-integer unsigned signed

我从方法中获取NSIntegerlong int)并将其用作方法中的参数,该方法采用NSUIntegerunsigned int)。

NSInteger input = [someObject someMethod];
[someOtherObject someOtherMethodWithNSUInteger: input];

这不是一个好主意。如果input是负数会怎样?我怎么能以 一个好习惯的方式做到这一点?当然,我可以去

[someOtherObject someOtherMethodWithNSUInteger: (NSUInteger)input];

但这不是一个好的解决方案,因为如果input为负,则不会将其约束为零。如果没有其他办法,我可以诉诸它,但我宁愿不要。

不起作用的解决方案:

为什么我不能让someMethod返回NSUInteger?或者someOtherMethodWithNSUInteger:NSInteger?这是因为我不拥有它们,它们是Cocoa Touch的一部分。

返回nil并使用NSError或抛出异常怎么样?我将此代码放入的方法符合协议,因此我无法在方法中添加(NSError**)参数,并且在没有nil的情况下返回NSError来解释为什么看起来像不好主意因为我无法访问someMethodsomeOtherMethod的源代码,所以我甚至无法修复。如果我抛出异常,我就无法捕获它,因为代码将由制作协议的封闭类使用。

如何修复此类型转换问题?

1 个答案:

答案 0 :(得分:1)

我认为答案有点简单,而且基本上就是你自己所说的。

如果someOtherMethodWithNSUInteger期望无符号,并且你唯一拥有的是有符号值(从someMethod返回),则会发生两件事:(1)预期的一半可能值永远不会被使用, (2)返回的一半可能值无效。无论您使用何种方法,您都会遇到这些问题。因此,最简单的方法是使用简单的类型转换,并修剪负值以防止它们被解释为非常大的正值。

[someOtherObject someOtherMethodWithNSUInteger: (NSUInteger)MAX(input,0)];