小编典典

在泛型中使用类型变量

swift

除了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.
}

This didn’t work either:

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>()
    }
}

阅读 694

收藏
2020-07-07

共1个答案

小编典典

Swift的静态类型意味着
必须在编译时知道变量的类型。

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

使用协议时,Swift使用动态调度,因此您可以编写代码
Array<MyProtocol>(),并且数组仅存储对
实现的对象的引用MyProtocol—因此,当您从数组中获取内容时,您可以
访问所需的所有函数/变量/类型别名MyProtocol。

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

我建议今年观看WWDC的一些视频:

Swift中面向协议的编程
在Swift中使用值类型构建更好的应用
我发现这张幻灯片对理解协议和

2020-07-07