gpt4 book ai didi

swift - 无法将 swift 泛型子类转换为泛型父类(super class)

转载 作者:搜寻专家 更新时间:2023-11-01 06:51:39 25 4
gpt4 key购买 nike

我想在 Swift 中使用参数化类编写更好更简洁的代码,但我遇到了一个奇怪的构建错误:

Cannot convert value of type 'CustomAdapter' to expected argument type 'TableTestParametrizedAdapter<ETableViewCell>'

我真正想要的是能够使用一种方法(在适配器子类中重写)创建一个基本适配器类,该方法用于将单元格子类与相应的数据模型绑定(bind),并且每次都摆脱转换。

我将在下面发布代码,以便更好地理解我的意思。

class TestParametrizedAdapter<C>: NSObject {

func doSmth(cell: C) {

}

}

class TableTestParametrizedAdapter<C>: TestParametrizedAdapter<C> where C:ETableViewCell {

}

class PeopleTableViewCell: ETableViewCell {

}

class CustomAdapter: TableTestParametrizedAdapter<PeopleTableViewCell> {

override func doSmth(cell: PeopleTableViewCell) {

}
}


class TestBaseController: UIViewController {

var adapter: TableTestParametrizedAdapter<ETableViewCell>?

override func viewDidLoad() {
super.viewDidLoad()

setAdapter(adapter: CustomAdapter()) // this is the line with build error
}

func setAdapter(adapter: TableTestParametrizedAdapter<ETableViewCell>) {
self.adapter = adapter
}
}

我读过其他一些关于此的帖子,有人指出 GenericClass<B>GenericClass<A>即使 B 是 A 的子类,它们也完全无关,因此您不能将一个转换为另一个。 ( https://stackoverflow.com/a/50859053/10115072 )

Anywat,有什么解决办法吗?在这种情况下,我们如何使用 Swift 参数化的强大功能?我使用 Swift 4。

提前致谢。

最佳答案

即使 Swift 支持自定义泛型的变化,您的代码也会出错,因为您尝试使用只能处理 PeopleTableViewCell 实例的对象来代替可以处理任何 ETableViewCell 的对象。如果这确实是您想要的,并且您不介意进行一些运行时检查,则可以使用少量类型删除来执行类似的操作:

class TestAnyAdapter: NSObject {
func doSmth(cell: Any) {}
}

class TableTestParametrizedAdapter<C>: TestAnyAdapter where C:ETableViewCell {
override func doSmth(cell: Any) {
guard let cell = cell as? C else {
return
}

self.doSmth(cell: cell)
}

func doSmth(cell: C) {}
}

其余代码将与您已有的代码相同,只是没有编译时错误。

关于swift - 无法将 swift 泛型子类转换为泛型父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56837030/

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