是对元类型的反射吗?



虽然可以从实例中获得属性列表:但它需要一个实例,如果类型不是微不足道的并且没有直接的.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")
}

相关内容

  • 没有找到相关文章

最新更新