虽然可以从实例中获得属性列表:但它需要一个实例,如果类型不是微不足道的并且没有直接的.init()
,则会很麻烦。类似地,我们不能测试嵌套类型的存在吗?
struct SomeStruct: Codable {
var x: Int
var y: Int
}
class CoolClass: Codable {
var thing: SomeStruct
var name: String
enum CodingKeys: String, CodingKey {
case name = "title", name = "stuff"
}
}
func testA(_ type: Any.Type) {
if type is Codable.Protocol {
print("is Codable")
} else {
print("is NOT Codable")
}
let mirror = Mirror(reflecting: type)
mirror.children // << empty collection!!
}
func testB<T>(_ type: T.Type) where T: Codable {
// test if `type` defines `CodingKeys` or if it is synthesized.
}
testA(SomeStruct.self) // "is NOT Codable", can't get list of ["x", "y"]
// , nor can't get CodingKeys...
如果没有对元类型的反射,我尝试借用Codable
的CodingKeys(显式的或合成的)都失败了。这可能吗?
我不知道如何解决您的主要问题,但您没有正确检查type
是否可编码。由于type
已经是一个结构/类类型(不是对象),您应该尝试将其从Any.Type
转换为Codable.Type
,只有当type
实现Codable
时才会成功:
if type as? Codable.Type != nil {
print("is Codable")
} else {
print("is NOT Codable")
}