HandyJSON 在 debug 和 release 下解析结果不一致

xpcnnkqh  于 3个月前  发布在  其他
关注(0)|答案(2)|浏览(56)

请教一下,为什么定义 class 的属性是 let 后,在 debug 和 release 下表现不一样,debug 下能正常解析,release 下却不能正常解析。

f2uvfpb9

f2uvfpb91#

补充下下:

swift 版本:5.0 以上

HandyJSON 版本:5.0.3-beta

测试代码:

import HandyJSON

class BaseResponse<T: HandyJSON>: HandyJSON {
    var code: Int?
    var data: T?
    required init() {}
}

/// 这个类的属性定义为 let,并且赋一个默认值
final class SampleData: HandyJSON {
    let id = 0
}

/// 测试 json
let jsonString = #"{"code":200,"data":{"id":1000}}"#
        
/// 从字符串转换为对象实例
if let mappedObject = JSONDeserializer<BaseResponse<SampleData>>.deserializeFrom(json: jsonString) {
    print(mappedObject.data!.id)
}

使用 Xcode 分别在 debug 和 release 下运行,debug 下得到正确的 1000,release 下得到的却是默认值 0.

很想知道,这是为啥,有木有大佬知道,求解~

t0ybt7op

t0ybt7op2#

这是因为Swift的debug和release模式下的编译优化级别是不同的。

在debug模式下,Swift编译器的优化级别很低,主要是为了保证代码的调试性,使得代码行为更加可预测,更容易进行调试。在这种情况下,即使你的模型属性是用let声明的,HandyJSON可能也能正确地解析JSON并赋值给这些属性,因为编译器在这种模式下不会对这些行为进行过多的优化和干预。

然而,在release模式下,Swift编译器的优化级别会提高,以提高代码的运行效率和性能。在这种模式下,编译器可能会更加严格地遵守Swift的语义规则,因此不允许对let声明的常量进行修改。这就可能导致HandyJSON在尝试修改这些属性时失败,从而导致解析错误。

因此,如果你的模型需要被HandyJSON或其他类似的库修改,你应该使用var而不是let来声明你的模型属性。这样可以确保你的代码在debug和release模式下都能正确地工作。

相关问题