首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用` `Codable`‘协议调用’`didSet`‘方法

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

Stack Overflow用户
提问于 2017-12-21 01:58:45
回答 1查看 1.7K关注 0票数 4

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

代码语言:javascript
复制
    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 ?? "") 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-21 02:13:57

与其使用didSet,不如将extendedText作为只读计算属性。请注意,在命名属性时使用camelCase而不是snake_case是Swift的惯例:

代码语言:javascript
复制
struct Sample: Codable {
    let text: String
    var extendedText: String {
        return "***" + text + "***"
    }
}
代码语言:javascript
复制
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)
}

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

代码语言:javascript
复制
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")
    }
}
代码语言:javascript
复制
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)
}

这将打印:

定了 样本文本

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47916883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档