Swift вложенный параметр generi c - PullRequest
2 голосов
/ 01 мая 2020

Swift 5.1. Рассмотрим следующий код. У меня нет проблемы , но мой код немного избыточен и это немного раздражает, поэтому мне интересно, есть ли способ сказать Swift выводить один из параметров c .

public class X0 {
}
public class X1: X0 {
}

public class C0<CONTAINED> {
    public var value: CONTAINED

    public init(_ value: CONTAINED) {
        self.value = value
    }
}

public class C1<T: X0>: C0<T> {
}

//public class CA<BOX: C0> { // ERROR Reference to generic type 'C0' requires arguments in <...>
public class CA<BOX: C0<T>, T> { // It's inconvenient that I have to give T as a parameter of the outer class; seems like it could be inferred
}

public func test() {
//    let v: CA<C1<X1>> // ERROR Generic type 'CA' specialized with too few type parameters (got 1, but expected 2)
    let v: CA<C1<X1>, X1> // This here is a little inconvenient to type, particularly when the class names are longer.
}

Кажется, что два X1 должны быть равны - я пробовал CA<C1<X0>,X1> и CA<C1<X1>,X0> на всякий случай, если есть какая-то логическая ошибка, которую я пропустил, но это дало мне ошибки для обоих поэтому я думаю, что оба должны быть точно равными, поэтому теоретически следует разрешить вывод, по крайней мере. Я попытался _ в нескольких местах и ​​пропустил параметр, но он дал мне ошибки.

1 Ответ

0 голосов
/ 01 мая 2020
  1. Вы можете очистить его только с помощью протоколов.
  2. Вы не можете помещать протоколы в типы, поэтому наименование должно выглядеть как Objective- C.
  3. Использование дело верблюда!
public class C0<?> {
  public var value: ?

  public init(_ value: ?) {
    self.value = value
  }
}

public protocol C0Protocol {
  associatedtype ?
}

extension C0: C0Protocol { }

public class CA<C0: C0Protocol> { }

public func test() {
  let v: CA< C1<X1> >
}
...