gpt4 book ai didi

swift - 在swift中子类化专门的泛型类

转载 作者:行者123 更新时间:2023-11-28 09:02:06 25 4
gpt4 key购买 nike

我有一个基于 AnyObject 的通用类 DataSource。使用下标函数从缓存中提取一些项目。

例如,当我将 DataSource 子类化时,下标函数不再被视为重写,随后在 SpecialDataSource 类型的对象上调用它时将调用父类(super class)版本。

class DataSource<T: AnyObject>: NSObject {
var cache: [T]?

subscript(idx: Int) -> T? {
if let hasStash = cache {
if idx < hasStash.count{
return hasStash[idx]
}
}
return nil
}
}


class SpecialDataSource<T> : DataSource<NSNumber> {
//The following declaration will generate:
//subscript does not override any subscript from its superclass

override subscript(idx: Int) -> T? {
if let hasStash = cache {
if idx < hasStash.count{
return hasStash[idx] as? T
}
}
return nil
}

}

在 Playground 中对此进行试验后,我发现如果 SpecialDataSource 声明为:

class SpecialDataSource<T> : DataSource<T>

我需要子类基于一个公共(public)对象,这样我就可以将其中的一些填充到同质数组中。

所以这个声明不提供那个选项。

当我收到此错误时,它听起来像 DataSource<NSNumber>是完全不同的父类(super class)。

知道这里出了什么问题吗?我试图理解为什么我的 SpecialDataSource 似乎无法覆盖此功能。

===============当前解决方案===========

我能够解决这个问题的唯一方法是将下标的返回类型专门化为 NSNumber,在适当的位置覆盖确实完成了工作。

不确定是否有更好的解决方案。请告诉我。我很乐意尝试一下。

class SpecialDataSource2<T: NSNumber> : DataSource2<NSNumber> {
override subscript(idx: Int) -> NSNumber? {
if let hasStash = cache {
if idx < hasStash.count{
return hasStash[idx] as? T
}
}
return nil
}

}

最佳答案

DataSource<NSNumber>确实是一个不同的父类(super class)。生成不同的代码!

将父类特化为使用 NSNumber 是没有意义的。更深层次的意图/目标是什么?如果您遵循 T 会出什么问题 child 和 parent 的模式?

假设父类有另一个方法xyz使用 T .那么现在已经绑定(bind)到 NSNumber , 所以 xyz期望一个 NSNumber .当然,任何子类都会继承 xyz方法。但是现在假设您的子类是用 NSString 实例化的对于 T。编译器应该用方法做什么 xyz对于 SpecialDataSource 的实例?您看到内在的冲突了吗?

由于“神奇灵活”的泛型,它们实际上附带了很多非常具体的规则。

关于swift - 在swift中子类化专门的泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31728341/

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