Xcode 13.3.1 编译问题
文档日期 2022-05-01
编译失败
主APP在Xcode 13.3.1环境下存在编译问题。
图例
关键词
'nil' requires a contextual type
Type 'GWWPostAtModel' does not conform to protocol 'DefaultsSerializable'
Ambiguous inference of associated type 'Bridge':
'DefaultsCodableBridge<GWWPostAtModel>' vs.
'DefaultsRawRepresentableBridge<GWWPostAtModel>'
SwiftyUserDefaults/Sources/BuiltIns.swift:59:23: Matching requirement
'_defaults' to this declaration inferred associated type to
'DefaultsCodableBridge<GWWPostAtModel>'
SwiftyUserDefaults/Sources/BuiltIns.swift:64:23: Matching requirement
'_defaults' to this declaration inferred associated type to
'DefaultsRawRepresentableBridge<GWWPostAtModel>'
通过build error 信息可以看出,协议有默认实现,但是关联类型的模糊推断冲突了。
SwiftyUserDefaults当前版本:5.0.0,DefaultsSerializable协议的默认实现见下图
官方社区
两个官方都有相关issues,关注及讨论数量较多,都是Xcode13.3的问题,Xcode13.2.1及以下编译正常。
SwiftyUserDefaults官方的issue
https://github.com/sunshinejr/SwiftyUserDefaults/issues/285
解决方案一
解决方案二
注意事项
下图所述内容与工程实际调试相符。
不同的模块组件,如果涉及使用SwiftyUserDefaults都需要做代码实现。
相同模块组件内仅需要一处代码实现。
swift官方的issue
https://github.com/apple/swift/issues/58084#event-6489785930
解决方案
未见相关修正的更新,保持关注。
APP 解决方案
对使用DefaultsSerializable协议的class、struct做默认实现。
经过对业务代码的梳理,发现代码涉及option的使用,为防止出现数据兼容性问题,使用下图处理方式。
示例
import Foundation
import SwiftyUserDefaults
public struct GWWPostAtModel: Codable, DefaultsSerializable {
let id: Int?
let tagName: String?
let avatar: String?
let signature: String?
}
/*
DefaultsSerializable默认实现在xcode13.3.1环境有bug,存在编译问题
https://github.com/sunshinejr/SwiftyUserDefaults/issues/285
https://github.com/apple/swift/issues/58084#event-6489785930
DefaultsSerializable start 👇🏻
*/
extension DefaultsSerializable where Self: Codable {
public typealias Bridge = DefaultsCodableBridge<Self>
public typealias ArrayBridge = DefaultsCodableBridge<[Self]>
}
extension DefaultsSerializable where Self: RawRepresentable {
typealias Bridge = DefaultsRawRepresentableBridge<Self>
typealias ArrayBridge = DefaultsRawRepresentableArrayBridge<[Self]>
}
/*
DefaultsSerializable end 👆🏻
*/
涉及修改点
基于APP 1.2.600 分支的podfile,在 dev模式拉取代码,修改。
涉及的库及相应分支见下图
如下图,修改后编译成功
注意事项
APP不同版本是否存在数据兼容性问题 ,需要相应模块负责人自查并告知测试同事重点回归测试。