如何使用 `Codable` 协议调用`didSet` 方法

Posted

技术标签:

【中文标题】如何使用 `Codable` 协议调用`didSet` 方法【英文标题】:How can I call `didSet` method using `Codable` protocol 【发布时间】:2017-12-21 01:58:45 【问题描述】:

如何使用Codable 协议调用didSet 方法。

    class Sample: Codable
        var text : String? 
            didSet 
                print("didSet") // do not call
                extended_text = "***" + text! + "***"
            
        
        var extended_text : String?
    

    let sample_json = "\"text\":\"sample text\""
    let decoder = JSONDecoder()
    let sample = try! decoder.decode(Sample.self, from: sample_json.data(using: .utf8)!)
    print(sample.text!)
    print(sample.extended_text ?? "") 

【问题讨论】:

【参考方案1】:

您应该将extendedText 设为只读计算属性,而不是使用 didSet。请注意,在命名属性时使用 camelCase 而不是 snake_case 是 Swift 约定:

struct Sample: Codable 
    let text: String
    var extendedText: String 
        return "***" + text + "***"
    


let sampleJson = """
"text":"sample text"
"""

do 
    let sample = try JSONDecoder().decode(Sample.self, from: Data(sampleJson.utf8))
    print(sample.text)            // "sample text\n"
    print(sample.extendedText)    // "***sample text***\n"
 catch 
    print(error)


如果您的目标是在初始化 Codable 结构时运行一个方法,另一种方法是编写您自己的自定义解码器:

class Sample: Codable 
    let text: String
    required init(from decoder: Decoder) throws 
        let container = try decoder.singleValueContainer()
        text = try container.decode(String.self)
        print("did set")
    


let sampleJson = "\"text\":\"sample text\""
let decoder = JSONDecoder()
do 
    let sample = try decoder.decode([String: Sample].self, from: Data(sampleJson.utf8))
    print(sample["text"]?.text ?? "")
 catch 
    print(error)

这将打印:

设置好了

示例文本

【讨论】:

谢谢。你是对的。但是,我的代码是示例。实际上处理更复杂,我想我需要保留转换后的对象。很抱歉我说得不够清楚。 谢谢。我修正了误导性的表述。 @MaikoOhkawa 请注意,这与Codable 协议无关。如果您设置文本属性sample.text = "any text",它将调用didSet,但不会在初始化classstruct时调用 我不知道“但在初始化你的类或结构时不知道”。我懂了。我的问题澄清了。我会考虑另一种处理。非常感谢。 @MaikoOhkawa 你可以做的是创建一个自定义解码器初始化器并在那里执行你需要的任何东西。

以上是关于如何使用 `Codable` 协议调用`didSet` 方法的主要内容,如果未能解决你的问题,请参考以下文章

Swift 使用Codable协议进行json转模型

使用具有多个键的 Codable 协议

Codable和CodingKeys

swift 中使用Codable进行数据解析

Codable : 不符合协议'Decodable'

Codable 类不符合协议 Decodable