比较 NSInteger 和 NSUInteger
Posted
技术标签:
【中文标题】比较 NSInteger 和 NSUInteger【英文标题】:Comparing NSInteger and NSUInteger 【发布时间】:2018-07-05 13:52:52 【问题描述】:我需要比较两个变量,以检查数组中是否存在索引:
indexPath.row
是 NSInteger
[self arrayOfData].count
是 NSUInteger
问题是它们属于不同的类型,当indexPath.row
=-1 时,它会自动转换为 18446744073709551615(无符号长整数),这是我要避免的。
如何检查NSIndexPath
的行定义的索引是否存在于NSArray
中?
代码:
- (void) checkIfIndexExists:(NSIndexPath*) indexPath inArray:(NSArray*)arrayOfData
if (indexPath.row >= [self arrayOfData].count) // indexPath.row=-1 gets interpretted as 18446744073709551615 (unsigned long)
DDLogDebug(@"Warning: Index doesn't exist %@", indexPath);
return;
【问题讨论】:
如果你知道你不会得到这么高的价值,那就投吧? @Larme 是的,现在可以使用了。 你如何以负 indexPath.row 值结束?是您自己设置还是通过 Apple API 以这种方式提供给您? @NimaYousefi 我自己设置它以指示未选择索引或基础数组中不存在数据 我通常不建议这样做,但如果你想以这种方式使用它,我建议设置indexPath.row = NSNotFound
,这是一个全局 NSInteger 值,你可以在这种情况下使用它。它被 Apple 广泛用于 NSRange,它也需要 NSIntegers。然后只需在代码中检查此条件,而不是对照数组计数。 developer.apple.com/documentation/foundation/…
【参考方案1】:
这是我通过将unsigned long
转换为long
来解决问题的方法
- (void) checkIfIndexExists:(NSIndexPath*) indexPath inArray:(NSArray*)arrayOfData
if (indexPath.row >= (long) [self arrayOfData].count) // indexPath.row=-1 gets interpretted as 18446744073709551615 (unsigned long)
DDLogDebug(@"Warning: Index doesn't exist %@", indexPath);
return;
【讨论】:
这实际上并不能解决您的问题。问题不在于强制转换,而在于 indexPath.row 是一个 NSInteger,当您将负数传递给它时,该值就会溢出。即使这在有限的情况下有效,代码也不正确,并且如果将来任何情况发生变化,也可能会中断。以上是关于比较 NSInteger 和 NSUInteger的主要内容,如果未能解决你的问题,请参考以下文章
NSInteger 和 NSUInteger 在混合的 64 位 / 32 位环境中
int 或 NSInteger 到 NSUInteger 用于索引
NSNumber 为 0 转换为 NSInteger/NSUInteger 变为 nil