gpt4 book ai didi

swift - 在 swift (Codable) 中向泛型提供类元数据

转载 作者:行者123 更新时间:2023-12-04 08:10:05 27 4
gpt4 key购买 nike

我有一个适用于 Codable 的方法s 并执行以下操作:

func doWhatever<T>() -> T? where T: Codable {
var myName = String(describing: T.self)
return nil // or whatever
}
然后我可以得到 myName作为运行时的类名来获取正确的数据来创建 T 的实例.
现在我的一些 Codable需要提供 custom为此名称。
所以虽然我可以编辑我所有的编码(几百个模型)以符合 some protocol提供姓名,我 真的想避免这样做。
由于 Swift 中没有自定义属性,所以我编造了这个;
protocol MetadataProvidingCodable {
static func customName() -> String
}
然后在我的通用我可以检查是否 T符合它:
func doWhatever<T>() -> T? where T: Codable {
var myName = String(describing: T.self)
if T.self is MetadataProvidingCodable.Type {
myName = ... // Get customName() from T without an instance???
}

return nil // or whatever
}
但我的问题是我需要能够在 T 上调用我的静态函数类型而没有 T 的实例.那可能吗?

最佳答案

您可以输入 T.selfMetadataProvidingCodable.Type像那样:

func doWhatever<T>() -> T? where T: Codable {
var myName = String(describing: T.self)
if let type = T.self as? MetadataProvidingCodable.Type {
myName = type.customName()
}

return nil // or whatever
}
编辑 :如果你能以某种方式将通用逻辑移到一个单独的函数中,你可以覆盖 doWhatever()函数与另一个返回符合两者的类型 CodableMetadataProvidingCodable .
然后编译器会根据返回类型确定调用什么函数:
func doWhatever<T>() -> T? where T: Codable {
print("doWhatever: Codable")
var myName = String(describing: T.self)
return nil
}

func doWhatever<T>() -> T? where T: Codable & MetadataProvidingCodable {
print("doWhatever: Codable & MetadataProvidingCodable")
var myName = T.customName()
return nil
}

struct Example1: Codable {}
struct Example2: Codable, MetadataProvidingCodable {
static func customName() -> String {
return "Example2"
}
}

let example1: Example1? = doWhatever()
let example2: Example2? = doWhatever()

// prints
// doWhatever: Codable
// doWhatever: Codable & MetadataProvidingCodable

关于swift - 在 swift (Codable) 中向泛型提供类元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66018957/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com