Типализм родового класса в Свифте

Я пытаюсь сделать typealias класса общего типа следующим образом

class Cars<T> {
  ...
}

typealias SportCars = Cars

но я получаю ошибку компиляции, как следует Reference to generic type 'Cars' requires argument in <...>

Ответы

Ответ 1

Прямо сейчас вы не можете сделать это с помощью дженериков, как вы обнаружили.

typealias Foo = Array
// Doesn't work: Reference to generic type 'Array' requires argument in <...>

Язык с быстрым программированием В главе iBook "Декларация псевдонима типа" фактически не указано ничего о том, какие типы не могут быть сглажены. Но это просто похоже на то, что частичные типы (например, генерики без указателей) не разрешены.

Если вы чувствуете, что это что-то, что должен сделать Swift, подайте Radar (bugreport) с Apple.

Во время исследования этого ответа я заметил, что проблема с частичным типом не только затрагивает typealias, но также видна и в другом месте:

let foo = Array.self
// Doesn't work: Cannot convert the expression type 'Array<T>.Type' to type 'Array<T>.Type'
// … which is a very confusing error.

var bar: Array.Type
// Doesn't work: Reference to generic type 'Array' requires arguments in <...>

let bar: Array.Type = Array.self
// …/usr/bin/swift: Segmentation fault! :-)

Все это работает, если вы укажете типы заполнителей:

typealias Foo = Array<Int> // Works
let foo = Array<Int>.self // Works

Ответ 2

Возможным обходным путем является объединение псевдонимов типа type в класс /struct:

struct SportCars<Y> {
  typealias T = Cars<Y>
}

/// Usage:
typealias Foo = SportCars<Int>.T

Ответ 3

Я думаю, что самый дальний вы можете пойти с typealias, а generics - создать псевдоним специализированного типа, например:

typealias SportsCar = Cars<Int>

Если вам нужно другое имя для одного и того же типа, вы можете просто подклассифицировать его:

class SportCars<T> : Cars<T> {}

это не совсем псевдоним (вы не можете использовать Cars, когда ожидается SportCars, но возможно наоборот), но в "контролируемой" среде он может работать. Я бы не использовал себя, хотя.