You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:05:47