Xcode10.2.1编译SKAdNetworkInfo报缺少返回值错误咨询
问题原因
- 该错误由Swift版本兼容性问题导致,和第三方库逻辑正确性无关。你当前使用的Xcode 10.2.1内置Swift版本为5.0,而引入的CriteoPublisherSdk采用了Swift 5.1及以上版本的语法特性编写。
- Swift 5.1才正式支持单表达式函数隐式返回语法:当函数整体仅包含一条用于返回值的表达式时,允许省略
return关键字,编译器会自动将该表达式的计算结果作为函数返回值。Swift 5.0没有这个特性,遇到省略return的返回值函数就会抛出「缺少return语句」的编译错误。 - 你遇到的三处报错刚好全部命中这个语法差异:
getAdNetworkIds(from:)方法的函数体仅包含一条解析Info.plist中SKAdNetwork条目的表达式hasCriteoId()类方法的函数体仅包含skanInfo.hasCriteoId一条返回表达式skAdNetworkIds()类方法的函数体仅包含skanInfo.adNetworkIds一条返回表达式
- 第三方库官方发布时通常以最新正式版Xcode为编译校验基准,不会全量回溯测试老版本Xcode的兼容性,因此会出现老环境编译失败的情况,不属于官方发布的源码错误。
- 报错对应截图参考:

具体报错信息:
/Pods/CriteoPublisherSdk/CriteoPublisherSdk/Sources/SKAdNetwork/SKAdNetworkInfo.swift:41:3: Missing return in a function expected to return '[String]'
/Pods/CriteoPublisherSdk/CriteoPublisherSdk/Sources/SKAdNetwork/SKAdNetworkInfo.swift:51:3: Missing return in a function expected to return 'Bool'
/Pods/CriteoPublisherSdk/CriteoPublisherSdk/Sources/SKAdNetwork/SKAdNetworkInfo.swift:55:3: Missing return in a function expected to return '[String]'
修复方案
- 最优方案:升级Xcode到11.0及以上版本(内置Swift 5.1+),无需修改任何源码即可直接编译通过,不会引入额外问题。
- 若受项目限制必须保留Xcode 10.2.1环境,可以直接给三个报错函数补充
return语句修复,修改后代码逻辑和原逻辑完全一致,不会产生功能偏差,修改后的对应代码片段如下:
// 原第41行位置的方法修改 static func getAdNetworkIds(from bundle: Bundle) -> [String] { return (bundle.object(forInfoDictionaryKey: Keys.items) as? [[String: String]])? .compactMap { item in item[Keys.identifier] } ?? [] } // 原CRSKAdNetworkInfo扩展修改 @objc extension CRSKAdNetworkInfo { public static let CriteoId = "hs6bdukanm.skadnetwork" public class func hasCriteoId() -> Bool { return skanInfo.hasCriteoId } public class func skAdNetworkIds() -> [String] { return skanInfo.adNetworkIds } }
- 注意:如果通过CocoaPods管理依赖,直接修改Pods目录下的文件会在下次执行
pod install时被覆盖。长期使用老Xcode环境的话,建议要么在Podfile中锁定CriteoPublisherSdk最后一个兼容Swift 5.0的版本,要么通过Podfile的post_install钩子在依赖安装完成后自动给对应文件补上return语句,避免重复修改。
内容的提问来源于stack exchange,提问作者Benjamin Rutford
相关产品推荐
相关产品推荐

