Swift - необязательный Generi c Type - PullRequest
0 голосов
/ 26 мая 2020

Можно ли в Swift сделать тип generi c необязательным? Например, я хотел бы сделать generi c type 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?

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Как Давид Пастор сказал, что у вас не может быть неиспользуемых типов.

Но вы можете создать иерархию классов generi c, где каждый дочерний класс имеет n+1 generi c переменные типа:

class GenericClass1<T> {
    public var t: T

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

class GenericClass2<T, U>: GenericClass1<T> {
    public var u: U

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

И используйте это так:

let i1 = GenericClass1(t: 1)
let i2 = GenericClass2(t: 1, u: "a")
1 голос
/ 26 мая 2020

Не бывает неиспользованного типа. Система типов должна знать тип всех переменных, и если вы объявляете общий тип c с двумя параметрами типа generi c, оба должны иметь тип.

Даже если значение u равно nil во время init, ему все еще нужен конкретный c тип, поскольку Optional сам по себе является общим c типом, поэтому вам нужно сообщить компилятору, что такое Optional<U>.

Более того, если вы не сделаете u неизменяемым, вы не можете гарантировать, что он никогда не будет иметь значения, просто не дав ему значения в init. (На самом деле вы даете ему значение, оно просто по умолчанию nil).

Итак, ответ НЕТ, вы не можете создать экземпляр своего GenericClass, не указав как T, так и U.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...