首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编码“`Codable`”协议的泛化方法

编码“`Codable`”协议的泛化方法
EN

Stack Overflow用户
提问于 2019-11-15 17:34:04
回答 2查看 61关注 0票数 1
代码语言:javascript
复制
import Foundation

protocol ProtocolA: Codable {
    var var1: String { get }
}

struct Type1: ProtocolA {
    var var1: String
    var var2: Int
}

struct Type2: ProtocolA {
    var var1: String
    var var2: Bool
}

func encode<T: ProtocolA & Encodable>(object: T) throws -> Data {
    return try JSONEncoder().encode(object as! T.Type)
}

error: argument type 'T.Type' does not conform to expected type 'Encodable'中将上述结果放到操场上

当我说T必须遵守Encodable时,为什么会发生这种情况?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-15 18:12:33

代码语言:javascript
复制
return try JSONEncoder().encode(object as! T.Type)

这意味着将object转换为T的元类型。类型的类型。例如,1是Int。但是"Int“本身有一个类型,即Int.Type,它是一种元类型。元类型不符合可编码性。

你的意思是:

代码语言:javascript
复制
return try JSONEncoder().encode(object as! T)

但你真的是说:

代码语言:javascript
复制
return try JSONEncoder().encode(object)

因为object总是T类型,这是函数签名中的显式类型。由于这个算法也不依赖于ProtocolA,所以这一切归结为:

代码语言:javascript
复制
func encode<T: Encodable>(object: T) throws -> Data {
    return try JSONEncoder().encode(object)
}
票数 3
EN

Stack Overflow用户

发布于 2019-11-15 17:40:36

您的编译器实际上是在抱怨您在结束时所做的转换类型,即将object转换为T的metatype,在您的示例中,无论是Type1.Type还是Type2.Type

从编码的角度来看,编译器需要知道的是确认到Encodable的模型,该模型隐含在T: Codable语句中。

代码语言:javascript
复制
import Foundation

protocol ProtocolA: Codable {
    var var1: String { get }
}

struct Type1: ProtocolA {
    var var1: String
    var var2: Int
}

struct Type2: ProtocolA {
    var var1: String
    var var2: Bool
}

func encode<T: Codable>(object: T) throws -> Data {
    return try JSONEncoder().encode(object)
}

let type2 = Type2(var1: "test1", var2: true)

print(type2)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58882058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档