intsig171 / SmartCodable

SmartCodable is a data parsing library based on Codable. It is simple to use, with robust compatibility being one of its main features. SmartCodable 是基于Codable实现的数据解析库。简单易用,强悍的兼容性是SmartCodable的主要特点。 表层API和功能几乎和HandyJSON一致,支持快速的迁移。
https://smart-codable.vercel.app
MIT License
417 stars 43 forks source link

新版本的一些提问 #9

Closed ET-LINK closed 7 months ago

ET-LINK commented 7 months ago

一: 旧版本用

struct Model: SmartCodable {
    var name: String = ""
    var age: Int = 0

    enum CodingKeys: String, CodingKey {
        case name = "nickName"
        case age
    }
}

新版本是必须要改成这样吗

struct Model: SmartCodable {
    var name: String = ""
    var age: Int = 0

    enum CodingKeys: CodingKey {
        case name
        case age
    }

    static func mapping() -> [MappingRelationship]? {
        [
            CodingKeys.name <--- "nickName",
            CodingKeys.age <--- "age"  
        ]
    }
}

二: enum和mapping()是否必须要写, enum不写是否会导致所有数据不解析, 如上面的age不需要映射的字段是否需要在mapping()里声明

三: mapping()有没有自定义方法, 比如以下将字符串解析成Int数组

struct Model: SmartCodable {
    var aList: [Int] = []
}

public required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        if let temString = try container.decodeIfPresent(String.self, forKey: . aList) {
            if temString.count > 0 {
                aList = temString.split(separator: ",").compactMap { Float($0.trimmingCharacters(in: .whitespacesAndNewlines)) }
            }
        }
}

四: @SmartOptional 是否已经弃用了

五: 我有上百个Model需要从2.x版本改3.x版本, 有什么其他建议吗

感谢解答

intsig171 commented 7 months ago

关于问题一:

您完全可以继续使用CodingKeys来处理,完全不受影响。CodingKeys的处理方式是系统底层的隐式实现,效率更高。

static func mapping() 方法主要是为了服务多个值映射的情况的(参考HandyJSON的自定义映射)。如果您没有这样的需求,不需要关注。

关于问题二:

CodingKeys不存在写不写的情况。 只存在是否需要重写的情况。 CodingKeys系统底层会隐式实现。具体可看:

https://github.com/intsig171/SmartCodable/blob/main/Document/建议/%23suggest%201%20在mapping方法中支持解析忽略.md

如果您需要忽略某些属性的解析,就重写CodingKeys删除要忽略的case。

mapping方法其实就是进一步对CodingKeys处理。

如果您不需要 【忽略属性】,也不需要【对属性重命名】,完全不需要操管它们。

关于问题三:

mapping()有没有自定义方法。 如果你有这样的需求,可以在didfinishMapping方法进行手动处理,即:先将字符串解析出来,再在解析完成的回调里面处理。

关于问题四:

@SmartOptional, 是2.0版本为了处理可选属性的解析的有缺陷的方案。3.0版本完全解决了这个问题,直接删除即可。无需额外处理。

关于问题四:如何批量更新?

我们项目中更新了100+的Model,半天就更新完了。 2.0 升级到 3.0版本,表面API没有本质的改动。没有想象中的麻烦。

需要适配的内容:

  1. @SmartOptional, 直接删除即可。
  2. 如果之前您没有使用了Map(自定义映射),几乎是无障碍更新。

可以访问QQ群:865036731,进一步沟通,

ET-LINK commented 7 months ago

感谢解答