Swift:运行时的泛型类型推断
看到奇怪的一般行为,这让我相信我的理解中遗漏了一些东西 我使用以下方法循环抛出一个JSON响应并调用一个泛型方法Swift:运行时的泛型类型推断,swift,generics,Swift,Generics,看到奇怪的一般行为,这让我相信我的理解中遗漏了一些东西 我使用以下方法循环抛出一个JSON响应并调用一个泛型方法User、Card和Ecard都继承自IDObject,IDObject又继承自Object(领域类) 泛型是否仅在编译时工作,或者是否有方法在运行时动态处理此问题?泛型在编译时进行计算,并指定一个具体的类型。没有“运行时类型推断”这样的东西 我认为你想要的主要改变是: func delete(_ type:IDObject.Type, ids:[Int]) { 您不想将此函数专门化
User
、Card
和Ecard
都继承自IDObject
,IDObject又继承自Object
(领域类)
泛型是否仅在编译时工作,或者是否有方法在运行时动态处理此问题?泛型在编译时进行计算,并指定一个具体的类型。没有“运行时类型推断”这样的东西 我认为你想要的主要改变是:
func delete(_ type:IDObject.Type, ids:[Int]) {
您不想将此函数专门化为类型
,只想传递类型
现在还不清楚对象(uquo:where:)
返回了什么,因此这可能会破坏delete
方法。您可能需要使其不那么具体:
func delete(_ objects:Results<Object>) {
func delete(uu对象:结果){
(这不是子类型的灵丹妙药;我假设
对象(u:where:)
准确返回结果
)你所说的“删除函数不能以这种方式推断泛型类型”到底是什么意思?你会得到一个编译器错误?(如果是,在哪里?)你在DataManager.shared.delete中缺少一个右括号(prop.type,ids:ids
,除非您用单个参数重载了delete
,否则不能用单个参数调用它(delete(objectsToDelete)
)。请您提供一个,包括预期行为和实际行为吗?@Hamish整个代码库非常大,我无权共享。我在这里对其进行了大量编辑,并修复了缺少的右括号。delete
确实超载了-delete(:)
方法需要一个结果
-IDObject
继承自对象
。我看到的行为是删除(对象:)方法,objects.count==0您不需要共享整个代码库–只需要一个最小的自包含示例,它再现了相同的问题。是DataManager.shared.delete
应该指delete(\uID:)
?对象(\uID:)
返回什么?(您甚至不必显示函数,只需模拟一个复制相同问题的函数即可。)ids
是否与问题相关?(如果不相关,请删除它)。我认为是通过“运行时的类型推断”他的意思是读协议可以选择静态或动态分派。他基本上是指静态分派与动态分派。我可能在这里遗漏了一些东西,但我不认为更改type
参数的静态类型将如何改变OP代码的运行时行为(考虑到他在调用delete
(假设它实际上是DataManager.shared.delete
),T
已经被推断为IDObject
)。还请注意,泛型只专门用于编译器优化。它可能已经被推断为IDObject
,但专门用于泛型充其量是令人困惑的,因为读者可能会相信正在发生更多的事情(因为此代码无法编译,所以很难进行测试)。“专门化”并不一定意味着编译器编写了函数的唯一版本。Array
是Array
对Int
的专门化,不管编译器是如何实现的。@RobNapier好的,你说得对w.r.t“专门化”:)我想说的唯一一点是“泛型在编译时进行评估,并指定一个具体的类型”有点误导,因为至少对我来说,这意味着编译器总是生成泛型函数的专门版本。(也许值得注意的是,不受约束的泛型占位符不必由具体类型来满足)@感谢你的解释。我试图实现的是通过一组数据循环并映射它(在领域中)对于不同的数据模型,它们都是IDObject
的子类。但是,正如我发现的,编译器使用IDObject
作为泛型
,而不是子类。正如您所建议的,我最初只是尝试传递类型
,但也没有得到我想要的结果。我可能需要重新讨论这个问题再次接近。这可能也是领域库如何进行映射的问题。
func delete(_ type:IDObject.Type, ids:[Int]) {
func delete(_ objects:Results<Object>) {