Xcode 9.3编译报错:未找到读取数组元素的方法,如何解决?
解决Xcode 9.3中CKRecord数组元素访问的编译错误
这个问题我之前也碰到过!本质是Xcode 9.3升级后,Clang编译器对Objective-C的类型检查变得更严格了。
问题根源
在Xcode 9.3之前,编译器会宽松地推断thePublicGameRecord[KEY_PLAYERSTATES]的类型——虽然它实际返回的是id类型,但编译器默认把它当成数组处理,允许直接用[i]下标访问。但升级后,编译器明确要求:id类型本身没有实现数组下标访问的方法(objectAtIndexedSubscript:),所以直接链式调用[i]就会抛出编译错误。
快速修复方案
有两种简单的解决方式,选哪种都可以:
方式1:显式类型转换后再访问下标
先把CKRecord中取出的对象转成明确的数组类型,再用下标访问:
// 先把值转成NSMutableArray(和你存储的类型一致) NSMutableArray *playerStates = (NSMutableArray *)thePublicGameRecord[KEY_PLAYERSTATES]; // 再正常访问下标 NSNumber *playerState = playerStates[i];
方式2:使用数组的objectAtIndex:方法
直接通过类型转换调用数组的实例方法,绕开下标运算符的限制:
NSNumber *playerState = [(NSMutableArray *)thePublicGameRecord[KEY_PLAYERSTATES] objectAtIndex:i];
额外的安全建议
顺便提一句,原代码里i从1开始循环到max_number_of_players,但Objective-C数组是0下标的,这样会直接跳过第一个元素(索引0),还会在最后一次循环访问超出数组范围的索引(比如数组有4个元素,索引到4就越界了),很容易导致运行时崩溃。建议改成:
for (int i = 0; i < max_number_of_players; i++) { NSMutableArray *playerStates = (NSMutableArray *)thePublicGameRecord[KEY_PLAYERSTATES]; if (i < playerStates.count) { // 再加个越界检查更安全 NSNumber *playerState = playerStates[i]; // 你的业务逻辑 } }
内容的提问来源于stack exchange,提问作者Thunk
相关产品推荐
相关产品推荐

