gpt4 book ai didi

Swift Generic 不显示 nil

转载 作者:行者123 更新时间:2023-11-28 14:14:55 26 4
gpt4 key购买 nike

我有以下通用结构,其中 data 可以是任何其他可编码对象

struct GeneralResponse<T:Codable>: Codable {
let message: String
let status: Bool
let data: T?

enum CodingKeys: String, CodingKey {
case message = "Message"
case status = "Status"
case data = "Data"
}

}

我有 Following Like 响应编码类,它将用作 GeneralResponse 中的 data

class ImgLike: Codable {
let id: Int?
let imageID, user: String?

@available(*, deprecated, message: "Do not use.")
private init() {
fatalError("Swift 4.1")
}
enum CodingKeys: String, CodingKey {
case id = "ID"
case imageID = "ImageID"
case user = "User"
}

}

问题 1:当 token 在 API 上过期时,响应 data 为空 {} 仍然显示 ImgLike 具有所有 nil 属性的对象。为什么它不显示数据为 nil ?

enter image description here

然后如果我检查 object?.data == nil 它显示 false !!所以我需要检查每个属性

问题 2:在 ImgLike 中,如果我使用自定义编码功能。 GeneralResponse 未使用 ImgLike 进行解析 未进行解析,它在 catch 语句中显示错误

required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
imageID = try values.decode(String.self, forKey: .imageID)
user = try values.decode(String.self, forKey: .user)

do {
id = Int(try values.decode(String.self, forKey: .id))

} catch {
id = try values.decode(Int.self, forKey: .id)

}
}

最佳答案

  1. Swift-nil 的等效项是 JSON-null 和 JSON-not-set{} 是 JSON 中的有效字典,因此不是 Swift-nil

  2. 我猜您的意思是在使用自定义解码器功能时会出现错误?这是预期的,因为默认解码器使用 decodeIfPresent 而不是 decode 来解码可选值,因为它们允许不被设置。
    由于您解码了一个空字典 {},所以没有任何值存在/设置。

计算字典中的键以避免从 JSON 解码-{}

这个 CodingKey-struct 接受它获得的每个 key 。

fileprivate struct AllKeysAllowed: CodingKey {
var stringValue: String
var intValue: Int?
init?(stringValue: String) {
self.stringValue = stringValue
}
init?(intValue: Int) {
self.intValue = intValue
stringValue = "\(intValue)"
}
}

struct GeneralResponse<T:Codable>: Decodable {
let message: String
let status: Bool
let data: T?

enum CodingKeys: String, CodingKey {
case message = "Message"
case status = "Status"
case data = "Data"
}

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

message = try container.decode(String.self, forKey: .message)
status = try container.decode(Bool.self, forKey: .status)

.data 解码为接受所有 key 的容器。
然后 JSON-dictionary 中的键数可以用 dataContainer.allKeys.count 读取。

        let dataContainer = try container.nestedContainer(keyedBy: AllKeysAllowed.self, forKey: .data)
if dataContainer.allKeys.count != 0 {
data = try container.decode(T.self, forKey: .data)
} else {
data = nil
}
}
}

关于Swift Generic 不显示 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52232423/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com