gpt4 book ai didi

带有泛型的 Swift 返回结构

转载 作者:行者123 更新时间:2023-11-30 12:33:01 24 4
gpt4 key购买 nike

我在使用泛型时遇到问题。

我有一个协议(protocol):SectionReusableView

public protocol SectionReusableView {

associatedtype AdapterType: SectionReusableViewAdapter

var adapter: AdapterType? { get set }

}

我有这个结构TableViewSectionReusableSupplementraryViewFactory

public struct TableViewSectionReusableSupplementraryViewFactory<T: SectionReusableView> {

public var adapter: T.AdapterType

public init(adapter: T.AdapterType) {

self.adapter = adapter

}

}

我想要的是创建一个函数,它将返回指定类型TAnyTableViewSectionReusableSupplementraryViewFactory

func supplementaryViewFactory<T>(at index: Int,
within tableView: UITableView) -> TableViewSectionReusableSupplementraryViewFactory<T>? {

let adapter = self.adapter(at: index, within: tableView)
let reuseIdentifier = self.reuseIdentifier(at: index)

switch reuseIdentifier {

case AwesomeReusableView.AwesomeReusableViewReuseIdentifier:

guard let adapter = adapter as? AwesomeReusableViewAdapter else { return nil }

return TableViewSectionReusableSupplementraryViewFactory<AwesomeReusableView>(adapter: adapter)

default:

return nil

}

}

但我收到此错误,但我不知道如何绕过

error: cannot convert return expression of type
'TableViewSectionReusableSupplementraryViewFactory<AwesomeReusableView>' to return
type 'TableViewSectionReusableSupplementraryViewFactory<T>?'

最佳答案

这不是通用函数的使用方式。

通用函数专门针对T本质上。创建一个全新的函数(在编译时)以在使用各种类型调用它的特殊情况下使用。

如果您在示例中注意到,您实际上并没有通过使用 T 来专门化该函数。 。您给它一个显式返回类型,该返回类型可能会或可能不会匹配未知的 T ,编译器不知道,因此不能允许它。

让我们想象一下,如果确实如此,假设您这样调用它 let factory = supplementaryViewFactory<FOO>(...)但在方法内部它实际上返回 TableViewSectionReusableSupplementraryViewFactory<BAR> !哎呀,你现在遇到了一个大问题

这是一个转换后的示例:

func supplementaryViewFactory<T>(...) -> TableViewSectionReusableSupplementraryViewFactory<T>? where T: SectionReusableView  {

let adapter = MyCoolAdapterClass()

guard let converted = adapter as? T.AdapterType else { return nil }

return TableViewSectionReusableSupplementraryViewFactory<T>(adapter: converted)

}

有几件事需要注意,首先是 TableViewSectionReusableSupplementraryViewFactory 的类型根据所需类型进行专门化。这意味着调用此函数的类型最终将确定 T 的内容。是。

所以你必须有这样的东西:

let factory : TableViewSectionReusableSupplementraryViewFactory<AwesomeReusableView>? = supplementaryViewFactory(...)

最后一点,Swift 是一种类型非常安全的语言,如果您希望允许工厂方法返回未知的专用类型,那么最好进一步抽象为仅返回原始协议(protocol)。在这种情况下,您不需要关心支持类型是什么。

关于带有泛型的 Swift 返回结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43233225/

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