我从方法中获取NSInteger
(long int
)并将其用作方法中的参数,该方法采用NSUInteger
(unsigned 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
来解释为什么看起来像不好主意因为我无法访问someMethod
或someOtherMethod
的源代码,所以我甚至无法修复。如果我抛出异常,我就无法捕获它,因为代码将由制作协议的封闭类使用。
如何修复此类型转换问题?
答案 0 :(得分:1)
我认为答案有点简单,而且基本上就是你自己所说的。
如果someOtherMethodWithNSUInteger
期望无符号,并且你唯一拥有的是有符号值(从someMethod
返回),则会发生两件事:(1)预期的一半可能值永远不会被使用, (2)返回的一半可能值无效。无论您使用何种方法,您都会遇到这些问题。因此,最简单的方法是使用简单的类型转换,并修剪负值以防止它们被解释为非常大的正值。
[someOtherObject someOtherMethodWithNSUInteger: (NSUInteger)MAX(input,0)];