- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个符合 CodingKey
的结构 DynamicKey
。然后我决定使用编码 [String: Any]
的函数来扩展 KeyedEncodingContainer
现有的功能..
现在我到达了 Struct Foo
中的一致性部分,但出现了编译器错误..
当编译器继承自具有一致性的 DynamicKey
时,编译器会说 Foo.CodingKeys
不符合 CodingKeys
的任何想法吗?
不工作的代码:
struct DynamicKey: CodingKey, Equatable, ExpressibleByStringLiteral {
var stringValue: String
var intValue: Int? { return nil }
init?(stringValue: String) {
self.stringValue = stringValue
}
init?(intValue: Int) {
return nil
}
//MARK:- Equatable Methods
public static func == (lhs: DynamicKey, rhs: DynamicKey) -> Bool {
return lhs.stringValue == rhs.stringValue
}
//MARK:- ExpressibleByStringLiteral Methods
public init(stringLiteral value: String) {
self.stringValue = value
}
public init(unicodeScalarLiteral value: String) {
self.init(stringLiteral: value)
}
public init(extendedGraphemeClusterLiteral value: String) {
self.init(stringLiteral: value)
}
}
extension KeyedEncodingContainer where Key: CodingKey /*where Key == DynamicKey*/ {
mutating func encodeDynamicValues(_ value: [String: Any], forKey key: Key) throws {
//Other code here..
}
}
struct Foo: Encodable {
var arr: [String: Any]
public func encode(to encoder: Encoder) throws {
//Compiler Error: Instance method 'container(keyedBy:)' requires that 'Foo.CodingKeys' conform to 'CodingKey'
//However, Foo.CodingKeys conforms to `CodingKey` because `DynamicKey` implements the protocol..
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encodeDynamicValues(arr, forKey: .arr)
}
enum CodingKeys: DynamicKey {
case arr
}
}
但是,如果我将 DynamicKey
更改为类,然后使用 &
运算符使枚举符合要求,编译器错误就会消失(没有 &
,它会给出同样的错误)..为什么?
工作代码:
final class DynamicKey: CodingKey { //I don't need the equatable and expressible when it's a class so ignore that part.. adding it doesn't change anything..
var stringValue: String
var intValue: Int? { return nil }
init?(stringValue: String) {
self.stringValue = stringValue
}
init?(intValue: Int) {
return nil
}
}
extension KeyedEncodingContainer where Key: CodingKey /*where Key == DynamicKey*/ {
mutating func encodeDynamicValues(_ value: Any, forKey key: Key) throws {
//Other Code Here..
}
}
struct Foo: Encodable {
var arr: [String: Any]
public func encode(to encoder: Encoder) throws {
//CodingKeys now conforms to `CodingKey` because I made `DynamicKey` a class and used the `&` `CodingKey`
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encodeDynamicValues(arr, forKey: .arr)
}
enum CodingKeys: DynamicKey & CodingKey {
case arr
}
}
最佳答案
第一个示例中的问题只是您对这一行的理解问题:
enum CodingKeys: DynamicKey
你说:
Any ideas why the compiler says that Foo.CodingKeys does not conform to CodingKeys when it inherits from DynamicKey which has the conformance?
但是 Foo.CodingKeys 不“继承自 DynamicKey”。没有什么可以从结构“继承”。这里的符号与继承无关。您所做的是一个具有 DynamicKey 类型的原始值的枚举。 (通常你无法做到这一点 - 原始值类型需要“可由字符串、整数或浮点文字表达”,但你可以通过将 DynamicKey Equatable 和 ExpressibleByStringLiteral 来解决这个问题。)
这与您所说的语法相同:
enum MyEnum : Int {
case myCase // zero
}
(您还因为对枚举使用神奇的名称 CodingKeys 而感到困惑。但这可能没有直接关系。)
<小时/>然后在第二个示例中,DynamicKey 是一个类,您会以完全相反的方式感到困惑。在这里,你做了一些完全不同的事情:
enum CodingKeys: DynamicKey & CodingKey {
在这里,您的枚举不有任何原始值类型;冒号后面的内容声明协议(protocol)限制。但在这里你又用另一种方式欺骗了自己,因为事实上 DynamicKey 部分是无关紧要的;如果您简单地说,代码也可以编译
enum CodingKeys: CodingKey {
该示例中真正发生的事情是,您要求自动合成与 CodingKey 的一致性,并且您已经得到了它。
关于swift - CodingKeys 一致性会产生编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55420192/
我一直在尝试使用自定义解码来解码 json,但我遇到了一个我无法解决的问题,而且我的想法已经用完了。我故意注释掉了 Order 结构中的 additionalInfo 只是为了让我的生活更轻松。 如有
我有一个符合 CodingKey 的结构 DynamicKey 。然后我决定使用编码 [String: Any] 的函数来扩展 KeyedEncodingContainer 现有的功能.. 现在我到达
是否可以为单个属性使用多个 CodingKey? struct Foo: Decodable { enum CodingKeys: String, CodingKey { ca
我正在研究 GRDB 数据模型。我的问题可能的根源在于测试版:版本 12.0 beta 2 (12A6163b)。 我在几个结构中出现间歇性错误。 Cannot find 'CodingKeys' 出
编译正常没有问题: class User: Codable { let name: String let email: String } 但是,如果我们有一个不是由 CodingKey
我正在尝试实现一个协议(protocol),其功能与 Codable 使用 CodingKeys 枚举的方式类似。 使用 Codable 和 CodingKeys,如果您没有在 CodingKeys
假设我有以下可解码结构作为示例,说明我正在尝试做的事情: struct Object: Decodable { var id: String var name: String } 和这
假设我们有一个 JSON 结构如下: { "July": [ { ... "startDate": "July 10",
考虑以下对象: struct User: Codable { let id: Int let email: String let name: String } 是否可以获得特定
我有我提供的类型 CodingKeys根据需要为其数据成员提供自定义名称。我想根据不同调用站点的要求,仅编码类型 CodingKeys 的一个子集。在将数据发送到服务器之前。所需的编码因调用站点而异,
当我尝试解码这个 json 时: "polls": [ { "title": "title", "date": "date", "summary": "summary", "stats
我正在尝试用我的 Codable 对象做一些自定义的事情。我的 JSON 对象使用多种类型的标记,因此我想让它们类型安全。为此,我创建了以下可编码类: class Token: Codable {
我尝试使用 Swift 4.1 的新功能在 JSON 解码过程中将蛇形命名法转换为驼峰命名法。 这是example : struct StudentInfo: Decodable { inte
我将以下结构发送到端点: struct IdleAlarmRequest: Encodable { let idleAlarm: [IdleAlarmParameters] enum
我正在使用 Codables 解析 JSON 数据。问题是我的几个编码键与变量名不同。为此,我使用了非常简单的 CodingKeys 枚举,但是我必须写下所有的键,我不想那样。我只想覆盖几个键,而不是
我正在尝试通过网络解析 JSON 数据。下面你可以看到魔法发生的地方。 func getBookingsForDate(date: String, completionHandler: @escapi
CodingKey 是否可以仅用于 JSONEncoder 而 JSONDecoder 使用默认成员名称? 例子我有以下结构 var str = """ { "name": "Endeavor", "
我尝试使用 Swift 4.1 的新功能在 JSON 解码期间将 snake-case 转换为 camelCase。 这是 example : struct StudentInfo: Decodabl
我有一个 struct 类型,其中列出了必须从 JSON 解码的不同类型,并且我找不到任何有关如何在我的 enum 中指定多个类型的信息,称为编码键。在最里面的字典中,有时一个键:值对将是 [Stri
我尝试从下面的 API 解码 API,但仍然收到以下错误: keyNotFound(CodingKeys(stringValue: "resources", intValue: nil), Swift
我是一名优秀的程序员,十分优秀!