gpt4 book ai didi

swift - 在泛型中使用类型变量

转载 作者:IT王子 更新时间:2023-10-29 05:13:03 28 4
gpt4 key购买 nike

我有this question除了 swift 。如何在泛型中使用 Type 变量?

我试过这个:

func intType() -> Int.Type {
return Int.self
}

func test() {
var t = self.intType()
var arr = Array<t>() // Error: "'t' is not a type". Uh... yeah, it is.
}

这也不起作用:

var arr = Array<t.Type>() // Error: "'t' is not a type"
var arr = Array<t.self>() // Swift doesn't seem to even understand this syntax at all.

有没有办法做到这一点?我感觉 Swift 就是不支持它,并且给我一些模棱两可的错误消息。

编辑:这是一个更复杂的示例,其中无法使用通用函数头规避问题。当然这没有意义,但我在我的代码中的某个地方对这种功能有一个明智的使用,我宁愿发布一个干净的例子而不是我的实际代码:

func someTypes() -> [Any.Type] {
var ret = [Any.Type]()
for (var i = 0; i<rand()%10; i++) {
if (rand()%2 == 0){ ret.append(Int.self) }
else {ret.append(String.self) }
}
return ret
}

func test() {
var ts = self.someTypes()

for t in ts {
var arr = Array<t>()
}
}

最佳答案

swift 的 static typing意味着变量的类型必须在编译时已知。

在通用函数的上下文中 func foo<T>() { ... } , T 看起来像一个变量,但它的类型实际上在编译时根据调用 函数的位置已知。 Array<T>() 的行为取决于 T ,但此信息在编译时已知。

当使用协议(protocol)时,Swift 使用动态调度,所以你可以写成Array<MyProtocol>() ,数组只是存储对实现 MyProtocol 的事物的引用— 所以当你从数组中得到一些东西时,你可以访问 MyProtocol 所需的所有函数/变量/类型别名.

但是如果t实际上是一个类型为 Any.Type变量 , Array<t>()是没有意义的,因为它的类型在编译时实际上是未知的。 (由于 Array 是一个通用结构,编译器需要知道将哪种类型用作通用参数,但这是不可能的。)

今年我会推荐观看一些来自 WWDC 的视频:

我发现这张幻灯片对于理解协议(protocol)和动态调度特别有帮助:

关于swift - 在泛型中使用类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30905060/

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