gpt4 book ai didi

Swift Generic 在 typealias 中被视为父级

转载 作者:可可西里 更新时间:2023-10-31 23:43:40 27 4
gpt4 key购买 nike

我有一个方法:

public func someMethod<Controller>(controller: Controller) {
print(controller)

typealias HandlerType = Controller -> UIViewController
let handler: HandlerType

print(handler.dynamicType)
}

在用 UIViewController 的子实例调用它之后,在我的例子中是 ViewController,它打印:

<Test.ViewController: 0x7fc43be479d0>
UIViewController -> UIViewController

我的目标是拥有这样的类型别名:

Test.ViewController -> UIViewController

我有 typealias 和声明的 valriable:

public typealias ControllerType = UIViewController 
public private(set) static var visibleController: ControllerType?

方法调用是:

if let controller = visibleController { 
someMethod(controller)
}

我不明白为什么 ViewController 在 typealias 中变成了 UIViewController,所以如果有人遇到此类问题,和/或有解决方案,请告诉我。

提前谢谢你。

最佳答案

这是因为您的 Controller 的静态类型和动态类型不同。

静态类型取自您的 ControllerType 类型别名,您已将其定义为 UIViewController。动态类型与 visibleController 指向的实例类型相同 - 在本例中为 Test.ViewController

因为泛型是从您传递给函数的静态类型推断出来的(它们的特化发生在编译时),Controller 将被推断为 UIViewController。因此,您的类型别名将是 UIViewController -> UIViewController,这就是您的 handlerdynamicType 将返回的内容(它似乎回退到静态类型时未分配)。

另一方面,您的 controller 的动态类型确实是 Test.ViewController,因为这是实例的 dynamicType你传入。

至于解决方案,在不知道您要在这里实现什么的情况下,很难说。

关于Swift Generic 在 typealias 中被视为父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37618110/

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