为什么在“numberOfSectionInTableView:”中使用NSInteger而不是NSUInteger?

9

numberOfSectionsInTableView: 是UITableView的数据源方法之一,其返回值类型为NSInteger。但是,UITableView不能具有负数行数;它只能有0或更多行,那为什么返回类型是NSInteger?这难道不会导致返回负整数而导致崩溃吗?


2
我觉得没有什么好理由。它应该是无符号的。 - EricS
@EricS - 在我看到下面borrrden的回答之前,我同意你的观点。 - pasawaya
1
@stackmonster - 部分原因是我想知道苹果是否粗心大意,错误地分配了返回值类型NSInteger,但更多的是因为我对方法的设计感兴趣,以及什么会影响苹果工程师使这个特定的方法具有这种特定的返回类型,当我提出问题时,它似乎是违反直觉的。 - pasawaya
4
我完全不理解borrrden的回答。段数只能为零或更高。根据定义,它应该是无符号整数。对于像open()这样的函数,-1表示错误条件,因此具有一个无效值对于变量来说确实很方便,就像指针的NULL / nil一样。 - EricS
似乎苹果正在尝试遵循某种惯例,即在不合适的情况下始终使用 NSInteger。这些方法的返回类型并不像使用 NSInteger 作为“numberOfRowsInSection”的参数类型那样糟糕,而一个相当常见的实现可能是将 section 用作 NSArray 的索引。当发生这种情况时,我必须手动进行类型转换为 NSUInteger,例如 [mySectionArray objectAtIndex:(NSUInteger)section],所有这些都是因为他们传入了 NSInteger 而不是 NSUInteger。 - Tim Dean
1个回答

5

使用无符号整数无法进行检查 (if var < 0) return; ,这是偏好使用有符号整数的标准原因。实际上,使用无符号整数的唯一原因是如果你需要更大的数字空间,而且你可以保证输入永远不会小于零。


2
我认为在这种情况下需要额外的空间是无关紧要的。如果某些东西不可能是负值,那么它应该被声明为无符号类型。苹果甚至不能声称这就是他们在这里使用NSInteger的原因:如果那是他们的理由,那么他们也应该在NSArray count]和其他NSArray方法上使用NSInteger。 - Tim Dean
@TimDean 请考虑一下。有些愚蠢的用户从他们的numberOfSections方法中返回-1。突然间,他们的表格就会有数十亿行,而不应该出现这种情况。为什么不将其设置为有符号整数,然后说“嘿,笨蛋,你使用了负值”?我并不是说他们就是这样做的,但我认为在负值没有意义的情况下返回有符号整数是一个有效的理由。至于NSArray,苹果控制着整个流程,因此不存在用户返回错误值的可能性。 - borrrden
1
似乎有点牵强附会。只需查看numberOfRowsInSection方法,再次传入了一个NSInteger。苹果在这里控制着管道,并且可以确定不会传入负值,但他们仍然传入了NSInteger而不是NSUInteger。最终,我认为合理的人们可能会对任何给定情况下哪种策略最好存在分歧。但仅在需要额外空间时才使用NSUInteger,我无法接受这一点,显然苹果也并非总是这样做。 - Tim Dean
@TimDean 我同意没有一个标准的共识来使用其中之一。然而,我不同意苹果控制numberOfRowsInSection的流程。这是另一个数据源方法,用户可以从自己的类中返回以影响表视图。我想我看待它的方式是“为什么要使用无符号值,当有符号值涵盖了有效范围并且是默认值?” - borrrden
1
我的numberOfRowsInSection参考是特指传递给方法的部分索引值,而不是它返回的值。Apple通过section参数控制传递给该方法的内容,但它将其声明为NSInteger(如果我将该值用作NSArray的索引,则需要进行annoying cast转换为NSUInteger)。我回答“为什么要麻烦”的问题很简单:接口应尽可能自我解释。如果您从不打算支持负值,请勿通过声明不同来让我进行研究。 - Tim Dean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接