【问题标题】:How to check response codable value is empty or not?如何检查响应编码值是否为空?
【发布时间】:2020-03-28 18:47:07
【问题描述】:

我也是 swift 和可编码的新手。我有以下可编码的。我在“RecentResult”中得到所有 API 的响应。我想检查“数据”是否为空。如何查看?

struct RecentResult: Codable 
    {
        let input: Input
        let commandResult: CommandResultClass
    }

    struct CommandResultClass: Codable {
        let success: Int
        let message: String
        let data: DataClass
    }

    struct DataClass: Codable {
        let recentCount: String

        enum CodingKeys: String, CodingKey {
            case recentCount = "RecentCount"
         }
    }

要解码,我正在使用这一行,但我不知道如何检查“数据”是否为空。

let strResponseData = try JSONDecoder().decode(RecentResult.self, from: data!)

【问题讨论】:

  • 按照你写的方式,它永远不会是空的。它始终是一个 DataClass 对象。

标签: ios swift swift5.1


【解决方案1】:

当您的数据中有类似可选项的内容时的一般提示...

如果你有这个..

struct example: Decodable {
  let name: String
  let nickname: String
  let tag: String
}

这三个必须存在,它们不能是“nil”,它们不能在 JSON 中不存在。

所以如果“昵称”根本不在 json 中,它就不会解析。

另一方面。如果您这样做,请注意问号:

struct example: Decodable {
  let name: String
  let nickname: String?
  let tag: String
}

那么.nickname 字段实际上可以是nil

那么,你可以这样说

if blah.nickname == nil { print("no nickname in the json!") }

你可以说你的问题“如何检查字段 XYZ 是否为空”的字面答案是“如果 strResponseData.xyz == nil”...

但是您必须向解析器表明,在 json 中它可能是 nil(即 json 看起来像这样......“昵称”:nil )或者它只是从 json 中丢失(只是没有json 中的字段“昵称”)。

你这样做的方式是使用“?”。

【讨论】:

  • 是的,完全同意你上面写的。我什至写信检查 if((strResponseData.commandResult.data) == nil) 但 Xcode 给我警告说“将'DataClass'类型的非可选值与'nil'进行比较总是返回false”。所以我不理解正确的写法。
  • 注意我的第二个代码块中的问号,你基本上必须改变 let data: DataClass 来让 data: DataClass? ..注意问号
  • 你救了我。非常感谢。
  • 完全没有问题@iWatch 但是,请注意一些糟糕的问题,比如 DataClass 可能不是空白的,但是里面的项目是空白的等等。这可能很麻烦
  • 我发现很好地解析东西可能需要做很多工作。一位英俊的列表成员问了这个问题,例如@iWatch stackoverflow.com/a/58611935/294884
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2012-12-13
  • 2020-08-27
  • 2021-11-17
  • 2015-12-24
  • 1970-01-01
  • 2015-02-08
相关资源
最近更新 更多