HandyJSON
HandyJSON copied to clipboard
在 debug 和 release 下解析结果不一致
请教一下,为什么定义 class 的属性是 let 后,在 debug 和 release 下表现不一样,debug 下能正常解析,release 下却不能正常解析。
补充下下:
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.
很想知道,这是为啥,有木有大佬知道,求解~
这是因为Swift的debug和release模式下的编译优化级别是不同的。
在debug模式下,Swift编译器的优化级别很低,主要是为了保证代码的调试性,使得代码行为更加可预测,更容易进行调试。在这种情况下,即使你的模型属性是用let声明的,HandyJSON可能也能正确地解析JSON并赋值给这些属性,因为编译器在这种模式下不会对这些行为进行过多的优化和干预。
然而,在release模式下,Swift编译器的优化级别会提高,以提高代码的运行效率和性能。在这种模式下,编译器可能会更加严格地遵守Swift的语义规则,因此不允许对let声明的常量进行修改。这就可能导致HandyJSON在尝试修改这些属性时失败,从而导致解析错误。
因此,如果你的模型需要被HandyJSON或其他类似的库修改,你应该使用var而不是let来声明你的模型属性。这样可以确保你的代码在debug和release模式下都能正确地工作。