这个 .encode 的扩展签名是什么?

What is the extension signature for this .encode?

我正在将核心数据实体的所有对象编码为 JSON。

我在核心数据实体扩展中有这些行...

public func encode(to encoder:Encoder) throws {
  var container = encoder.container(keyedBy: CodingKeys.self)
  try container.encode(name, forKey: .name)
  ...
}

我想在 container.encode 部分为 .encode 部分创建一个扩展,这样我就可以截取它并根据需要进行更改..

我看到这个 .encode 有以下签名

public mutating func encode<T>(_ value: T, forKey key: KeyedEncodingContainer<K>.Key) throws where T : Encodable

蚂蚁属于

public struct KeyedEncodingContainer<K> : KeyedEncodingContainerProtocol where K : CodingKey {

如果我想覆盖KeyedEncodingContainer的这个encode,扩展头应该怎么写?

这是我盲目展示我需要的东西...

extension KeyedEncodingContainer<K> : KeyedEncodingContainerProtocol where K : CodingKey {
  override func encode<T>(_ value: T, forKey key: Self.Key) throws where T : Encodable
    // stuff here
  }
}

换句话说,我需要用我的替换 encode。这可能吗?

根据@shadowrun,我无法扩展它,因为它是一个结构。

因此,假设我创建了一个名为 EncodingNormalized 的 class,但这是不正确的。

class EncodingNormalized {
  class func encode(container:KeyedEncodingContainer<Key> where Key : CodingKey) {
  }
}

我仍然需要 class 和 func 编码签名。没那么容易。

because I want to intercept the value as it is being encoded to change the format to what I want. Example: dates are being encoded as numbers and I need them as string with a specific format.

如果您要处理 JSONEncoder,请在编码器上设置 dateEncodingStrategy 以按照您想要的格式提供日期。

如果您不处理 JSONEncoder,并且您还处理日期以外的其他自定义格式设置,那么您可以在 encode(to: ) 实现中手动完成(例如,转换一些东西否则为字符串,然后对字符串进行编码)。