【问题标题】:Filtering empty values from an API in swift快速过滤来自 API 的空值
【发布时间】:2021-12-06 11:46:18
【问题描述】:

我正在尝试在 swift(UIKit) 中以 json 格式从 api 中过滤掉空值和 null 值。 完整的数据返回如下所示,但有时在 characteristic 键中可能包含 null 或空值。总是会有相同数量的键。

//Cat

{
"breedname": "Persian",
"picture": "https://catimage.random.png",
"characteristic1": "Shy",
"characteristic2": "Hungry all the time"
"characteristic3": "Likes apples"
"characteristic4": "Grey color"
"characteristic5": "likes chin scratches"
 }

{
"breedname": "Bengal",
"picture": "https://catimage.random.png",
"characteristic1": "Active",
"characteristic2": "Adventurous"
"characteristic3": ""
"characteristic4": ""
"characteristic5": ""
 }

{
"breedname": "ragdoll",
"picture": "https://catimage.random.png",
"characteristic1": "Fiestey",
"characteristic2": "sharp claws"
"characteristic3": null
"characteristic4": null
"characteristic5": null
 }

为了在 UI 中显示之前过滤 null 和空值,我有一个如下所示的 Decodable 类和一个自定义 init 类,该类使用 decodeifPresent 方法将 null 值更改为 nill。但是对于空值,我刚刚创建了一个将空字符串值转换为 nill 的方法。我不确定是否有更好的方法来处理空数据和空数据并将它们过滤掉?我参考了 UI 中的所有可解码键,因此我不能简单地删除键本身。

struct Cat: Decodable {
    
    let breedName: String
    let picture: String
    let characteristic1 : String?
    let characteristic2 : String?
    let characteristic3 : String?
    let characteristic4 : String?
    let characteristic5 : String?

enum CodingKeys: String, CodingKey {
        case breedName
        case picture
        case characteristic1
        case characteristic2
        case characteristic3
        case characteristic4
        case characteristic5
}

    func checkEmpty(s: String?) -> String? {
        if s == "" {
            return nil
        }
        return s
    }

init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)

        self.breedName= try container.decode(String.self, forKey: .breedName)
        self.picture = try container.decode(String.self, forKey: .picture)
        self.characteristic1 = try container.decodeIfPresent(String.self, forKey: .characteristic1)

        self.characteristic2 = try container.decodeIfPresent(String.self, forKey: .characteristic2)
        self.characteristic3 = try container.decodeIfPresent(String.self, forKey: .characteristic3)
        self.characteristic4 = try container.decodeIfPresent(String.self, forKey: .characteristic4)
        self.characteristic5 = try container.decodeIfPresent(String.self, forKey: .characteristic5)

self.characteristic1 = checkEmpty(s: self.characteristic1)
self.characteristic2 = checkEmpty(s: self.characteristic2)
self.characteristic3 = checkEmpty(s: self.characteristic3)
self.characteristic4 = checkEmpty(s: self.characteristic4)
self.characteristic5 = checkEmpty(s: self.characteristic5)

【问题讨论】:

    标签: ios json swift api uikit


    【解决方案1】:

    一种解决方案是检查在字符串扩展中定义的函数中是否为空

    extension String {
        func emptyAsNil() -> String? {
            self.isEmpty ? nil : self
        }
    }
    

    然后你可以在初始化中一步完成所有操作

    self.characteristic1 = try container.decodeIfPresent(String.self, forKey: .characteristic1)?.emptyAsNil()
    

    但也许更好的解决方案是将所有这些属性收集到一个集合中,例如数组或字典。这里我选择了一个数组

    struct Cat: Decodable {
        let breedName: String
        let picture: String
        var characteristics: [String]
    }
    

    然后在初始化中我们只向数组添加非零、非空值

    if let value = try container.decodeIfPresent(String.self, forKey: .characteristic1), !value.isEmpty {
        characteristics.append(value)
    }
    

    或者另一种方法是遍历键

    let keys: [CodingKeys] = [.characteristic1,
                                  .characteristic2,
                                  .characteristic3,
                                  .characteristic4,
                                  .characteristic5]
    
    for key in keys {
        if let value = try container.decodeIfPresent(String.self, forKey: key), !value.isEmpty {
            characteristics.append(value)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      相关资源
      最近更新 更多