gpt4 book ai didi

ios - Swift 泛型类型属性和方法

转载 作者:可可西里 更新时间:2023-11-01 01:37:35 25 4
gpt4 key购买 nike

如何在属性中存储泛型类型,然后使用该类型属性传入方法?

我有一个工厂,其方法接收 View Controller 类型但返回该 View Controller 的实例(容器负责处理)。

public protocol ViewControllerFactoryProtocol {
func getViewController<T: UIViewController>(type: T.Type) -> UIViewController
}

public class ViewControllerFactory: ViewControllerFactoryProtocol {

private let container: Container

public init(container: Container) {
self.container = container
}

public func getViewController<T: UIViewController>(type: T.Type) -> UIViewController {
return self.container.resolve(type)!
}

我有这样的属性(property)

var destinationViewController: UIViewController.Type { get }

现在我想做这样的事情:

factory.getViewController(self.destinationViewController)

我将 destinationViewController 声明为 LoginViewController.self

但它不是那样工作的。奇怪的是,如果我直接这样做,它会起作用:

factory.getViewController(LoginViewController.self)

有什么帮助吗?谢谢

最佳答案

没有看到 resolve 的代码无法说出它崩溃的原因,但我有一个好主意。我怀疑您误解了泛型类型参数和运行时类型参数之间的区别。考虑这个简化的代码。

func printType<T>(type: T.Type) {
print("T is \(T.self)")
print("type is \(type)")
}

class Super {}
class Sub: Super {}

printType(Super.self) // Super/Super. Good.
printType(Sub.self) // Sub/Sub. Good.

let type: Super.Type = Sub.self
printType(type) // Super/Sub !!!!!!

为什么最后一个案例是Super/Sub?因为printType<T>在编译时解决。它只查看定义:

func printType<T>(type: T.Type)
let type: Super.Type

printType(type)

要完成这项工作,我需要一个 T这样 T.TypeSuper.Type相同.好吧,那是 Super .所以这被编译为:

printType<Super>(type)

现在在运行时,我们看到 type等于Sub.self ,它是 Super.type 的子类型,所以没关系。我们将其传递给 printType<Super>并获得您所看到的响应。

所以可能在 resolve 内部, 你正在使用 T您想使用的地方 type ,并且您正在尝试“解决” UIViewController ,这可能返回零。

关于ios - Swift 泛型类型属性和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34722101/

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