Я пытаюсь сделать typealias класса общего типа следующим образом
class Cars<T> {
...
}
typealias SportCars = Cars
но я получаю ошибку компиляции, как следует Reference to generic type 'Cars' requires argument in <...>
Я пытаюсь сделать typealias класса общего типа следующим образом
class Cars<T> {
...
}
typealias SportCars = Cars
но я получаю ошибку компиляции, как следует Reference to generic type 'Cars' requires argument in <...>
Прямо сейчас вы не можете сделать это с помощью дженериков, как вы обнаружили.
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
Возможным обходным путем является объединение псевдонимов типа type в класс /struct:
struct SportCars<Y> {
typealias T = Cars<Y>
}
/// Usage:
typealias Foo = SportCars<Int>.T
Я думаю, что самый дальний вы можете пойти с typealias
, а generics - создать псевдоним специализированного типа, например:
typealias SportsCar = Cars<Int>
Если вам нужно другое имя для одного и того же типа, вы можете просто подклассифицировать его:
class SportCars<T> : Cars<T> {}
это не совсем псевдоним (вы не можете использовать Cars
, когда ожидается SportCars
, но возможно наоборот), но в "контролируемой" среде он может работать. Я бы не использовал себя, хотя.