无法编译AudioKit 4.2.2,执行build_frameworks.sh遇compactMap报错
解决AudioKit 4.2.2编译时
compactMap不存在的错误 嘿,这个问题我之前帮不少开发者解决过,其实根源是Swift版本的兼容性问题:
你遇到的具体报错如下:
[AVAudioUnit?]' has no member 'compactMap'
return _effectsChain.compactMap { $0 }
^~~~~~~~~~~~~ ~~~~~~~~~~
/Users/sky/Desktop/AudioKit-4.2.2/AudioKit/Common/Nodes/Mixing/Mixer/AKMixer.swift:40:19: error: value of type '[AKNode?]' has no member 'compactMap'
self.init(inputs.compactMap { $0 })
^~~~~~ ~~~~~~~~~~
这是因为compactMap是Swift 4.0才正式引入的语法,而你的开发环境(Xcode/Swift版本)低于这个版本,所以编译器识别不了这个方法。AudioKit 4.2.2的代码依赖了Swift 4.0+的特性,就出现了这类报错。
下面给你两种可行的解决办法:
方法一:升级开发环境版本
- 确保你的Xcode版本至少是9.0(Xcode 9对应Swift 4.0),如果当前用的是更旧的Xcode,直接升级到支持Swift 4.0及以上的版本。升级完成后,重新运行
build_frameworks.sh脚本,这个问题应该就能自动解决。
方法二:手动替换代码兼容旧版本
如果暂时没法升级环境,可以直接修改报错的代码文件,把compactMap替换成旧版本Swift支持的等效写法:
- 打开报错的文件:
/Users/sky/Desktop/AudioKit-4.2.2/AudioKit/Common/Nodes/Mixing/Mixer/AKMixer.swift - 找到第40行的
inputs.compactMap { $0 },把compactMap改成flatMap - 找到另一处报错的
_effectsChain.compactMap { $0 },同样替换成flatMap - 保存所有修改后,重新执行
build_frameworks.sh脚本
补充说明:在Swift 4.0之前,
flatMap承担了现在compactMap的功能——过滤数组中的nil值并自动解包可选类型,所以替换后代码逻辑完全一致,不会影响AudioKit的功能。
内容的提问来源于stack exchange,提问作者Luciano Sclovsky
相关产品推荐
相关产品推荐

