Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift:运行时的泛型类型推断_Swift_Generics - Fatal编程技术网

Swift:运行时的泛型类型推断

Swift:运行时的泛型类型推断,swift,generics,Swift,Generics,看到奇怪的一般行为,这让我相信我的理解中遗漏了一些东西 我使用以下方法循环抛出一个JSON响应并调用一个泛型方法User、Card和Ecard都继承自IDObject,IDObject又继承自Object(领域类) 泛型是否仅在编译时工作,或者是否有方法在运行时动态处理此问题?泛型在编译时进行计算,并指定一个具体的类型。没有“运行时类型推断”这样的东西 我认为你想要的主要改变是: func delete(_ type:IDObject.Type, ids:[Int]) { 您不想将此函数专门化

看到奇怪的一般行为,这让我相信我的理解中遗漏了一些东西

我使用以下方法循环抛出一个JSON响应并调用一个泛型方法
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>) {