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不同版本是否存在数据兼容性问题 ,需要相应模块负责人自查并告知测试同事重点回归测试。