2016-06-11 3 views
1

Допустим, у меня есть общий класс:Swift: Декларация в обобщенном классе

class SomeClass<Element> { 
    // What is the difference between this: 
    var array: [SomeClass]! 

    // and this declaration: 
    var array2: [SomeClass<Element>]! 
} 

В чем разница между этими декларациями?

+1

Казалось бы, они абсолютно одинаковые, только для 'array' общего аргумент случаен. Однако я не могу найти его в языковой ссылке. – Sulthan

+1

Похоже, что нет - я бы ожидал разницы, но похоже, что они эквивалентны. – luk2302

+2

Обратите внимание, что вы можете щелкнуть по свойствам в Xcode, чтобы увидеть, что он выводит тип - действительно, они кажутся одинаковыми. Кажется, это особый случай вывода типа при обращении к родовому классу в пределах его собственного объявления. – Hamish

ответ

4

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

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

Обратите внимание, что это работает только потому, что вы использовали SomeClass внутри декларации SomeClass. Это не сработало бы для другого родового класса.

Похожего Выведение общих аргументов можно использовать в объявлениях переменных:

let instance: SomeClass = SomeClass<Int>() 
let array: Array = [1] // Array<Int> 
Смежные вопросы