草庐IT

swift - 子类化通用类

coder 2023-09-16 原文

我正在尝试在 Swift 中子类化一个泛型类,但无论我做什么,编译器都会不断提示,或者更糟的是,出现段错误。

这是我最接近编译它的一次,但是我无法创建子类的实例,因为编译器出于某种原因无法推断出 T 是什么。

protocol GenericDataSourceCellProtocol {
    associatedtype ModelType
    var model: ModelType? {get set}
}

struct MyCellState {}

class MyCell: UITableViewCell, GenericDataSourceCellProtocol {
    var model: MyCellState?
}

class Generic2DDataSource<U, T>
where U:GenericDataSourceCellProtocol, U:UITableViewCell, T == U.ModelType {

    let items: [[T]]
    init (items: [[T]]) {
        self.items = items
    }
}


class SubclassedDataSource: Generic2DDataSource<MyCell, MyCellState> {}

let state = MyCellState()
let items = [[state]]
let datasource = SubclassedDataSource(items: items)
// cannot convert value of type '[Array<MyCellState>]' to expected argument type '[[T]]'

有没有办法让它工作?我错过了什么?

最佳答案

这里发生了很多事情,非常重要的 Swift 类型系统的事情。但是,这就是您想要的吗?

protocol GenericDataSourceCellProtocol {
    associatedtype ModelType

    var model: ModelType? {get set}
}

struct MyCellState {}

class MyCell: UITableViewCell, GenericDataSourceCellProtocol {

    typealias ModelType = MyCellState

    var model: MyCellState?
}

class Generic2DDataSource<U> where U: GenericDataSourceCellProtocol, U: UITableViewCell {

    typealias T = U.ModelType

    let items: [[T]]

    init(items: [[T]]) {
        self.items = items
    }
}


class SubclassedDataSource: Generic2DDataSource<MyCell> {

}

let state = MyCellState()
let items = [[state]]
let datasource = SubclassedDataSource(items: items)

而且,我认为你所拥有的在技术上应该是有效的,因为我发现如果我将你的代码更改为此,它会使错误消失:

protocol GenericDataSourceCellProtocol {
    associatedtype ModelType

    var model: ModelType? {get set}
}

struct MyCellState {}

class MyCell: UITableViewCell, GenericDataSourceCellProtocol {

    typealias ModelType = MyCellState

    var model: ModelType?
}

class Generic2DDataSource<U, T> where U: GenericDataSourceCellProtocol, U: UITableViewCell, T == U.ModelType {

    let items: [Array<U.ModelType>]

    init(items: [Array<U.ModelType>]) {
        self.items = items
    }

    func thing() -> T {
        let value = items[0][0]

        return value
    }
}

class SubclassedDataSource: Generic2DDataSource<MyCell, MyCellState> {
}

注意我添加了一个函数thing到基类。我这样做是因为在 Xcode 中您可以选择并单击变量 value它会让你知道编译器确定它是什么类型。在这种情况下,value类型是 T即使我指定了 items成为[Array<U.ModelType>] .由于 T == U.ModelType,它们应该相同但由于某种原因,它无法在子类编译期间解决这个问题。

不过,根据你所拥有的,我认为 T并不是真正必要的,因为您要在 U 和 T 之间形成关系。只需提供 U 作为通用参数就足够了,就像在我的第一个代码块中一样。

关于swift - 子类化通用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45972053/

有关swift - 子类化通用类的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. Ruby——嵌套类和子类是一回事吗? - 2

    下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby​​解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc

  3. Ruby - 如何处理子类意外覆盖父类(super class)私有(private)字段的问题? - 2

    假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案

  4. ruby - 在 ruby​​ 中使用正确的异常子类 - 2

    我可以访问ruby​​的异常层次结构(它在镐和蜂鸟中都提到过),但我不确定使用哪个异常,因为我没有找到关于每个术语含义的任何信息。使用正确的异常类重要吗? 最佳答案 创建您自己的异常时很重要。一个重要的警告是,继承自Exception而不是StandardError(常见错误)的异常不会被rescue捕获(没有任何参数)。 关于ruby-在ruby​​中使用正确的异常子类,我们在StackOverflow上找到一个类似的问题: https://stackove

  5. ruby-on-rails - 如何从 ruby​​ 父类(super class)中的方法访问子类中的当前 __FILE__ - 2

    我希望为日志设置一个默认路径,相对于使用日志的文件路径,像这样:#/path/to/lib/bar.rbclassBardefsettings_file_pathFile.dirname(File.expand_path(__FILE__))endend#/path/to/app/models/foo.rbclassFoo理想输出:#=>/path/to/app/models实际输出:#=>/path/to/lib因为FILE引用了它写入的文件,而不是它被调用的地方,它返回bar.rb文件,但我想要这样的东西返回foo.rb文件的路径,即使该方法是在Bar中定义的。有人有什么建议吗?

  6. ruby - 如何在子类中的方法前后运行代码? - 2

    我的第一个想法是这样的:classAbstractBuilderattr_reader:time_takendefbuild_with_timerstarted_at=Time.nowbuild@time_taken=Time.now-started_atenddefbuildraise'Implementthismethodinasubclass'endendclassMyBuilder我怀疑有更好的方法可以提供更好的灵active,例如理想情况下,我想在MyBuilder的实例上调用“build”而不是“build_with_timer”,并且始终记录执行时间。我确实考虑过使用al

  7. ruby-on-rails - 在 Rails 中实现具有灵活深度的类别和子类别的最佳方法? - 2

    我的项目中有一个类别和子类别模型。我想以灵活的方式拥有许多子级别。我想制作一个self引用的“父”外键,但我不太确定该怎么做。有任何想法吗?谢谢!Cat1Sub1SubSub1SubSub2Sub2Cat2Sub1Cat3Sub1Sub2SubSub1 最佳答案 试试acts_as_tree插件 关于ruby-on-rails-在Rails中实现具有灵活深度的类别和子类别的最佳方法?,我们在StackOverflow上找到一个类似的问题: https://st

  8. ruby-on-rails - 在 rails 4 中实现通用搜索 - 2

    我有一个带有多个模型和View页面的Rails4应用程序。我的应用程序的应用程序布局包含一个搜索栏。但它目前处于非事件状态。搜索栏的目的是让用户在所有模型中搜索输入的关键字,基本上使其成为全局搜索。有没有通用搜索的gem?或者它必须通过sql查询手动完成?我可以看到在其View页面上实现对特定模型的搜索的方法。但我希望它一次搜索所有模型。我该怎么办? 最佳答案 我认为在您的情况下最好的方法是使用ElasticSearch。提供了一个简洁的集成gemhere.该页面上提供了指向文档的链接。

  9. ruby-on-rails - Ruby 通用文件系统库 - 2

    我正在寻找用于ruby​​的“虚拟文件系统”类型库。我希望能够拥有一个完全通用的文件系统,我可以轻松地在使用本地文件和使用S3或使用FTP或类似的东西之间切换。(等同于Java的VFS)有没有人为ruby​​使用过任何类型的通用文件系统(我只需要它来支持本地文件和AmazonS3)如有任何指点,我们将不胜感激。 最佳答案 看看Vfs(虚拟文件系统)——它通过本地文件系统、AWSS3、SFTP提供简单而统一的接口(interface)。概览:http://alexeypetrushin.github.com/vfsS3样本:http:

  10. ruby - 在 ruby​​ 中对 Fixnum 进行子类化 - 2

    所以我知道您不应该直接继承Fixnum、Float或Integer,因为它们没有#new方法。虽然使用DelegateClass似乎可行,但这是最好的方法吗?任何人都知道这些类没有#new的原因是什么?我需要一个行为类似于Fixnum的类,但有一些额外的方法,我希望能够从类中通过self引用它的值,例如:classFoo10 最佳答案 您可以很容易地自己设置一个快速转发实现:classMyNumdefinitialize(number)@number=numberenddefmethod_missing(name,*args,&bl

随机推荐