首页 > 解决方案 > Swift - 可选的泛型类型

问题描述

在 Swift 中,是否可以将泛型类型设为可选?例如,我想U在下面的类中将泛型类型设为可选。

class GenericClass<T, U> {
  public var t: T
  public var u: U?

  init(t: T) {
    self.t = t
  }

  init(t: T, u: U) {
    self.t = t
    self.u = u
  }
}

let i1 = GenericClass(t: 1) // Generic parameter 'U' could not be inferred
let i2 = GenericClass(t: 1, u: "a")

我知道我能做到

let i1 = GenericClass<Int, Any>(t: 1) // no error
let i2 = GenericClass(t: 1, u: "a")

有没有办法在不设置未使用类型的情况下完成这项工作U

标签: swiftgenerics

解决方案


没有未使用的类型。类型系统需要知道所有变量的类型,如果你声明一个带有 2 个泛型类型参数的泛型类型,那么两者都需要有一个类型。

即使 的值unilinit,它仍然需要一个特定的类型,因为Optional它本身是一个泛型类型,所以你需要告诉编译器是什么Optional<U>

此外,除非您将u其设为不可变,否则您不能仅通过不在init. (实际上你确实给了它一个值,它只是默认为nil)。

所以答案是否定的,你不能在GenericClass不同时指定Tand的情况下实例化你的U


推荐阅读