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)
}
2条答案
按热度按时间f2uvfpb91#
补充下下:
swift 版本:5.0 以上
HandyJSON 版本:5.0.3-beta
测试代码:
使用 Xcode 分别在 debug 和 release 下运行,debug 下得到正确的 1000,release 下得到的却是默认值 0.
很想知道,这是为啥,有木有大佬知道,求解~
t0ybt7op2#
这是因为Swift的debug和release模式下的编译优化级别是不同的。
在debug模式下,Swift编译器的优化级别很低,主要是为了保证代码的调试性,使得代码行为更加可预测,更容易进行调试。在这种情况下,即使你的模型属性是用let声明的,HandyJSON可能也能正确地解析JSON并赋值给这些属性,因为编译器在这种模式下不会对这些行为进行过多的优化和干预。
然而,在release模式下,Swift编译器的优化级别会提高,以提高代码的运行效率和性能。在这种模式下,编译器可能会更加严格地遵守Swift的语义规则,因此不允许对let声明的常量进行修改。这就可能导致HandyJSON在尝试修改这些属性时失败,从而导致解析错误。
因此,如果你的模型需要被HandyJSON或其他类似的库修改,你应该使用var而不是let来声明你的模型属性。这样可以确保你的代码在debug和release模式下都能正确地工作。