gpt4 book ai didi

generics - 在 Swift 中使用泛型不能将类型转换为 T

转载 作者:行者123 更新时间:2023-11-28 07:13:24 27 4
gpt4 key购买 nike

我遇到了一个有趣的用例。代码非常简单:

protocol MXKTabBarDataSource {
func createTabAtIndex(tabIndex: Int) -> MXKTab
}

class MXKTabBar<T: MXKTab>: UIView {
private var tabs = [T]()

var dataSource: MXKTabBarDataSource?

private func createTabs() {
if self.dataSource != nil {
for tabIndex in 0..<2 {
// getting a compiler error here saying: 'MXKTab is not convertible to T'
self.tabs.append(self.dataSource!.createTabAtIndex(tabIndex))
}
}
}

class MXKTab: UIView {
var title: String?
}

我想知道这是为什么。 Tab bar约束T为MXKTab,createTabAtIndex的返回类型也是MXKTab。

谁知道问题出在哪里以及如何解决?非常感谢您的帮助。

最佳答案

如果 MXKTab 是一个类,那么您在此处的声明表明 MXKTabBar 可以使用 MXKTab 的任何子类创建。您在数据源上调用一个方法(我假设)返回一个 MXKTab 对象。但是,如果您使用 MXKTab 的某个子类(例如,MXKPolkaDotTab)实例化 MXKTabBar,那么您的 createTabs 方法不会返回 T; MXKTab != MSXPolkaDotTab.

您可能想要做的是让您的数据源受到T 的约束。以下是来自 playground 的一些示例代码,可以实现您想要的效果而不会产生太多提示:

class MXKTab {}

class MXKSpecialTab: MXKTab {}

protocol MXKTabBarDataSource {
typealias TabType

func createTabAtIndex(tabIndex: Int) -> TabType
}

class SpecialTabDataSource: MXKTabBarDataSource {
typealias TabType = MXKSpecialTab

func createTabAtIndex(tabIndex: Int) -> TabType {
return MXKSpecialTab()
}
}

本质上,您必须在实现类中指定 TabType。

(一个更糟糕的想法是将您的数据源返回的任何内容转换为 T,这在实践中可能有效,但我在理论上不推荐这样做。)

我并不完全清楚这是使用可选值的合适位置,但我需要查看更多代码才能真正理解这一点。

关于generics - 在 Swift 中使用泛型不能将类型转换为 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27493635/

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