2016-08-31 4 views
2

В Swift 2.2, у меня есть следующие классы:Swift 2.2 - Использование инициализатора с переменным числом параметров типа класса

protocol Base {} 

class FirstImpl: Base {} 

class SecondImpl: Base {} 

class Container { 
    private var typeNames = Set<String>() 

    init(_ types: Base.Type...) { 
     for type in types { 
      typeNames.insert(String(type)) 
     } 
    } 
} 

Если бы я только добавить один тип класса в контейнер, то он отлично компилируется:

let c = Container(FirstImpl) 

Но если я начну добавлять больше типов классов, то он не будет компилироваться:

let c = Container(FirstImpl, SecondImpl) 

ошибка сборки:

Невозможно преобразовать значение типа «(FirstImpl, SecondImpl) .Type» ожидаемого типа аргумента «» Base.Type

Является ли это ограничение в Swift компилятором или я делаю что-то не так?

ответ

2

Это путаное сообщение об ошибке, но проблема в том, что вам необходимо использовать .self, чтобы использовать refer to the types ваших классов при передаче их в функцию. Таким образом, вы будете хотеть сделать:

let c = Container(FirstImpl.self, SecondImpl.self) 

Ваш первый пример, который компилируется без .self фактически a bug (который был решен в Свифта 3) - см this Q&A для получения дополнительной информации.

 Смежные вопросы

  • Нет связанных вопросов^_^