当前位置: 首页 > 面试题库 >

在泛型中使用类型变量

宋高寒
2023-03-14
问题内容

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

问题答案:

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

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

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

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

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

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



 类似资料:
  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

  • 此代码只是使用中间的来删除重复项,其中元素之间的相等性是根据提供的比较器定义的。 让我们给局部类型推断一个机会吧,我(天真地)想...于是我将上面的代码改为: 这对我来说是有意义的,因为的类型可以从的类型推断出来,或者我是这么想的。但是,修改后的代码无法编译,并生成以下错误: 注意1:编译代码的一种方法是将返回类型更改为。不过,那是一套很难用的... 注意2:另一种方法是在比较器中不使用逆变,但我

  • 我有一个场景,我必须使用Mapstrt将对象(来自网络请求)转换为对象(数据层)来处理对象映射。我正在尝试创建一个通用的接口,以防止必须为每个资源定义自定义映射器,如下所示: 但这会导致构建错误(但是编译成功): 错误:(13,4)错误:无法为泛型类型变量源生成映射方法。 这不可能吗?如果没有,我将不得不为每个创建一个自定义映射器,并使用根据类类型等告诉反序列化器要使用哪个映射器。。。它可能会变得

  • 我正在使用泛型在python中创建一个List类(类似于java列表的列表)。类节点也是通用的,我正在为上一个和下一个节点创建 getter 和 setters 方法。我想知道如何返回像类节点本身这样的类型?这是我的进步: 我试过 但它给了我错误

  • 我需要将包含类型为Pair的对象的列表序列化为xml 首先,我创建了一个类PairList来保存对的列表,然后我创建了一个实际的类,它表示一对两个值,key和value。 然后,我尝试序列化它: 不幸的是,我遇到了一个异常:。欢迎任何关于如何避免此异常并序列化该类的想法。 如果我选择不序列化ttype和utype字段(通过将其设置为受保护或私有),则序列化有效。我不明白为什么它不想序列化类型字段。

  • 泛型类型 除了反省函数, Swift允许你定义自己的泛型类型. 它们是可以用于任意类型的自定义类、结构体、枚举, 和Array、Dictionary方式类型. 1. 定义泛型类型 定义一个普通的结构体 struct IntStack { var items = [Int]() mutating func push(_ item: Int) { items.appen