Xcode 9.3构建失败:PromiseKit相关Pod报字典元素读取方法未找到错误
我之前碰到过一模一样的情况——Xcode 9.2能正常跑的项目,升级到9.3就因为老版本PromiseKit的代码报错。这个问题本质是Xcode 9.3对Objective-C的类型检查变得更严格了,而你用的PromiseKit/Foundation 1.5.0和PromiseKit-AFNetworking 0.1.7都是比较老旧的版本,完全没适配Xcode 9.3的新规则。报错行里的promises被编译器推断成了id<NSFastEnumeration,NSObject>类型,而非预期的NSDictionary,自然找不到字典的下标读取方法。
下面给你几个可行的解决方案,按推荐程度排序:
方案1:升级PromiseKit版本(最推荐)
老版本的1.x分支早就停止维护了,升级到兼容Xcode 9.3的新版本是一劳永逸的办法:
- 修改你的Podfile,更新依赖版本:
pod 'PromiseKit/Foundation', '~> 6.0' # 6.x及以上版本都适配Xcode 9.3+ pod 'PromiseKit-AFNetworking', '~> 3.0' # 对应适配的AFNetworking扩展版本 - 执行命令更新Pods:
pod repo update pod install
⚠️ 注意:6.x版本的PromiseKit API有较大变动,你需要对照官方的迁移文档调整项目中使用PromiseKit的代码,但这是长期维护的必要步骤。
方案2:临时修改Pod代码(应急用)
如果暂时没时间做版本升级,可以手动修改报错的Pod文件代码,给promises做类型强转:
找到报错的代码行,把:
PMKPromise *promise = promises[key];
改成:
PMKPromise *promise = ((NSDictionary *)promises)[key];
这样编译器就能正确识别promises的字典类型,顺利通过编译。不过要注意:执行pod update后这个修改会被覆盖,所以这只是临时应急的办法。
方案3:放宽Xcode编译检查(不推荐)
你也可以通过降低编译严格度来绕过这个错误,但可能会引入其他潜在问题,只适合临时测试:
- 打开项目的Build Settings
- 搜索
Strict Checking of objc_msgSend Calls - 将该选项设置为
NO
总的来说,优先推荐升级PromiseKit版本,这是解决问题最彻底的方式,也能避免后续Xcode版本升级带来的类似问题。
内容的提问来源于stack exchange,提问作者Yalamandarao

