热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

将无效网址解码为nil

如何解决《将无效网址解码为nil》经验,为你挑选了1个好方法。

在您回答之前:

我意识到:

空字符串是无效的 URL

我可以写一个定制的解码器 Employee

我可以宣布urlString

我正在寻找一种更好的解决方案,用于解码可选项URL本身。我希望Codable我缺少一些魔法!


所以,我有JSON之类的

let json = Data("""
                {
                    "name": "Fred",
                    "url": ""
                }
                """.utf8)

以及包含可选URL的相应​​对象…

struct Employee: Decodable {
    let name: String
    let url: URL?
}

由于urlJSON中的内容无效,因此我希望将其解码为nil,而不是抛出错误。

尝试以下操作不起作用(不会被调用)…

extension Optional where Wrapped == URL {
    init(from decoder: Decoder) throws {
        let cOntainer= try decoder.singleValueContainer()
        do {
            self = try container.decode(URL.self)
        } catch {
            self = nil
        }
    }
}

过去我用过……

struct FailableDecodable: Deodable {

    let wrapped: T?

    init(from decoder: Decoder) throws {
        let cOntainer= try decoder.singleValueContainer()
        do {
            self.wrapped = try container.decode(T.self)
        } catch {
            print("Error decoding failable object: \(error)")
            self.wrapped = nil
        }
    }
}

struct Employee: Decodable {
    let name: String
    let url: FailableDecodable?
}

但这需要我不断提及url.wrapped

有更好的解决方案吗?



1> rraphael..:

如果您使用的是Swift 5.1,则可以使用@propertyWrapper

let json = """
{
    "name": "Fred",
    "url": ""
}
""".data(using: .utf8)!


@propertyWrapper
struct FailableDecodable: Decodable {
    var wrappedValue: Wrapped?

    init(from decoder: Decoder) throws {
        let cOntainer= try decoder.singleValueContainer()
        wrappedValue = try? container.decode(Wrapped.self)
    }
}

struct Employee: Decodable {
    let name: String

    @FailableDecodable
    private(set) var url: URL?
}

let employee = try! JSONDecoder().decode(Employee.self, from: json)
employee.url // nil


推荐阅读
author-avatar
手机用户2602901471
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有