Почему я не могу использовать инициализатор, требуемый протоколом, когда ограничиваю протокол классом? - PullRequest
1 голос
/ 23 апреля 2019

Swift не позволит мне скомпилировать следующий код с сообщением об ошибке

Для создания объекта типа класса 'T' со значением метатипа необходимо использовать инициализатор 'required'

в указанной строке.Используемый инициализатор явно требуется протоколом.Перемещение конструкции в инициализатор вызывает ту же проблему.Если я удаляю where Self: ChannelUser (и код, использующий его метод), все компилируется.Проблема также может быть решена с помощью инициализатора в ChannelUser, но это явно не так.

Почему это так?Я что-то не так делаю или это ошибка?

class ChannelUser {
    func ready() {
        print("ready")
    }
}

class A: ChannelUser {  // Cannot be used with MockChannelUser because the initializer takes an Int
    init(a: Int) {
        // do something clever with a
    }
}

class B: ChannelUser, MockableChannelUser {  // Can be used with MockChannelUser
    override required init() {}
}

protocol MockableChannelUser where Self: ChannelUser {
    init()
}

struct MockChannelUser<T: MockableChannelUser> {
    let user = T()  // Error: Constructing an object of class type 'T' with a metatype value must use a 'required' initializer

    init() {
        user.ready()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...