int 或 NSInteger 到 NSUInteger 用于索引
Posted
技术标签:
【中文标题】int 或 NSInteger 到 NSUInteger 用于索引【英文标题】:int or NSInteger to NSUInteger for index 【发布时间】:2014-02-21 04:52:40 【问题描述】:我正在尝试(在 Xcode5 中)将“removeObjectAtIndex”用于“MutableArray”,它需要一个 NSUInteger,但我使用的变量是一个整数,所以我使用 (NSUInteger *) 进行了转换,但我收到一个警告表示从较小的整数类型转换为 'NSUInteger *'(又名 unsigned long *)。我没有在代码中使用变量“second”来保持警告,但它也是一个整数
-(void) moveObjectAtIndex:(NSUInteger *)oldIndex toNewIndex:(NSUInteger *)newIndex
id *member = [self.array objectAtIndex:*oldIndex];
[self.array removeObjectAtIndex:*oldIndex];
if ((NSInteger)newIndex >=(self.array.count))
newIndex--; //i casted newIndex because I got a warning about ordered comparison of NSUInteger with NSInteger (I'm not sure if this is best solution)
[self.array insertObject:member atIndex: *newIndex];
-(void)moveObjectInArray:(NSMutableArray *)array
[array moveObjectAtIndex:(NSUInteger *) first toNewIndex:second];
【问题讨论】:
为什么是星号/指针?为什么不直接将这些整数作为参数传递(并直接检索它们)?您不太可能混淆自己,并且您没有使用指针作为指针做任何事情(据我所知)。 您和@Chuck 关于指针和星号所说的完全正确。我提出了这里每个人都说的建议,并解决了问题。谢谢 【参考方案1】:您对指针的使用完全靠不住。 id*
应该只是 id
和 NSUInteger*
应该只是 NSUInteger
- 你不想要指向对象的指针或指向整数的指针。
【讨论】:
【参考方案2】:只使用 NSUInteger 而不是 NSUInteger* 对您有什么问题?
-(void) moveObjectAtIndex:(NSUInteger)oldIndex toNewIndex:(NSUInteger)newIndex
id member = [self.array objectAtIndex:oldIndex]; //Here is id, id* is wrong
[self.array removeObjectAtIndex:oldIndex];
newIndex = newIndex >= self.array.count ? : self.array.count - 1; // Here should be self.array.count - 1, not newIndex-1
newIndex = MIN(_cloudListArray.count, newIndex);
[self.array insertObject:member atIndex:newIndex];
【讨论】:
【参考方案3】:在下面的语句中
if ((NSInteger)newIndex >=(self.array.count))
您正在将指针类型转换为 NSInteger。应该是
if ((NSInteger)*newIndex >=(self.array.count))
不过,您仍应小心类型转换,并警惕任何有符号/无符号转换或数据丢失造成的后果。
还有,在这一行
[array moveObjectAtIndex:(NSUInteger *) first toNewIndex:second];
first
的类型应为NSUInteger *
或相同大小。请注意,long 在 64 位环境中是 64 位的,将较小的指针类型转换为较大的指针类型将产生未定义的行为。同样适用于second
。一种解决方案是使用临时变量,然后将结果复制回来。
【讨论】:
你能给我一个如何使用临时变量的例子吗?如果我让 NSUInteger *random = first 应用相同的警告并且我不能使用 id 类型的变量。以上是关于int 或 NSInteger 到 NSUInteger 用于索引的主要内容,如果未能解决你的问题,请参考以下文章
不兼容的整数到指针的转换将“NSInteger”(又名“int”)发送到“NSInteger *”(又名“int *”)类型的参数
从'NSInteger'(又名'int')分配给'NSString *'的不兼容整数到指针转换;