Objective c NSArray计数返回长整数?
我制作了一个简单的NSArray,然后从该数组中获取一个随机索引并将其存储为int,但是我收到一条警告,说它应该是一个长int,尽管我只希望它返回0、1或2。这不是一个问题,但我不明白为什么Objective c NSArray计数返回长整数?,objective-c,xcode,count,nsarray,long-integer,Objective C,Xcode,Count,Nsarray,Long Integer,我制作了一个简单的NSArray,然后从该数组中获取一个随机索引并将其存储为int,但是我收到一条警告,说它应该是一个长int,尽管我只希望它返回0、1或2。这不是一个问题,但我不明白为什么 NSArray *randomWordList = [NSArray arrayWithObjects:@"Hello", @"Test", @"Send", nil]; int randomWordIndex = rand() % [randomWordList count];` NSArray的c
NSArray *randomWordList = [NSArray arrayWithObjects:@"Hello", @"Test", @"Send", nil];
int randomWordIndex = rand() % [randomWordList count];`
NSArray的
count
方法返回NSUInteger
,这是64位生成的无符号长
。编译器之所以警告您,是因为int
所包含的数字范围小于long
,因此它警告您可能会丢失数据
只需将
int randomWordIndex
更改为nsuinter randomWordIndexNSArray的count
方法返回nsuinter
,对于64位构建而言,它是一个无符号长
。编译器之所以警告您,是因为int
所包含的数字范围小于long
,因此它警告您可能会丢失数据
只需将int randomWordIndex
更改为nsuinter randomWordIndex
,您就可以对其进行强制转换。您必须同意,编译器无法知道元素计数,因为数组是动态分配的,所以它只是假设最大值,即整数。您可以强制转换它。您必须同意,编译器无法知道元素的计数,因为数组是动态分配的,所以它只是假设最大的值,即整数。从技术上讲,count
返回无符号的long,并且按照通常的整数提升规则,%
的结果会变长。Objective-C在抱怨这一点时是随机的。从技术上讲,count
返回一个无符号的long,并且按照通常的整数提升规则,它会使%
的结果变长。Objective-C在抱怨这一点时是随机的。在我看来,应该避免使用强制转换,最好使用正确的类型作为randomWordIndex
,特别是在这种情况下,randomWordIndex
很可能会提供给objectAtIndex:
,它希望NSUInteger
已经存在。当然可以,但是如果他真的想要int
,那么,他可以使用:)@dreamlax-奇怪的是,如果你直接将长度
赋值给int
,编译器不会抱怨。仅当您首先对值执行操作时。您必须承认,NSArray不太可能包含超过20亿个条目。在我看来,应该避免强制转换,最好为randomWordIndex
使用正确的类型,特别是在这种情况下,randomWordIndex
很可能会提供给objectAtIndex:
,它希望NSUInteger
已经存在。当然可以,但是如果他真的想要int
,那么,他可以使用:)@dreamlax-奇怪的是,如果你直接将长度
赋值给int
,编译器不会抱怨。仅当您首先对值执行操作时。你必须承认,NSArray不可能包含超过20亿个条目。谢谢,我在看一本xcode已经过时的书,这是一个新功能还是他们犯了同样的错误?NSUInteger
是在Mac OS X 10.5中引入的。再次感谢,我只是好奇,我做了一个长整数,它不再抱怨了,只是想知道为什么:)事实上,Leopard引入了整数,但是,我怀疑索引是否是int
类型,因为int
是有符号的;这会浪费记忆你应该像@dreamlax建议的那样做NSUInteger
,而不是long int
谢谢,我在看一本xcode已经过时的书,这是一个新功能还是他们犯了同样的错误?NSUInteger
是在Mac OS X 10.5中引入的。再次感谢,我只是好奇,我做了一个长整数,它不再抱怨了,只是想知道为什么:)事实上,Leopard引入了整数,但是,我怀疑索引是否是int
类型,因为int
是有符号的;会浪费内存您应该按照@dreamlax的建议使用NSUInteger
,而不是long int