В вашем коде нет ничего плохого, это просто невозможно.
class TestService<T> where T: TestProtocol
Предложение where
означает, что T
может быть чем угодно, с тем ограничением, что данный объект должен соответствует TestProtocol
.
Функция автозаполнения Xcode отображает только разрешенный тип , когда он доступен, но не отображает ограничения для универсального, и, к сожалению, ничего нетвы можете сделать это.
У вас точно такая же проблема в стандартной библиотеке swift, с Dictionary
, например,
public struct Dictionary<Key, Value> where Key : Hashable {
public init(dictionaryLiteral elements: (Key, Value)...) {
// ..
}
}
Универсальный Key
в качестве ограничения Hashable
, но Xcode по-прежнему показывает _
в списке автозаполнения.
(dictionaryLiteral: (_, _)...)">
Я предполагаю, что разработчики Swift используют это поведение, поэтому оно не будетбудет большой проблемой, даже если ваш код встроен в библиотеку.
Как пользователь узнает (конечно, не читая документацию), какой тип можно использовать в этом контексте, когда он даже незная, какой протокол он должен реализоватьMent?
Потому что Xcode довольно ясно говорит о требованиях к протоколу.Если я попытаюсь инициализировать TestService
с помощью String
, я получу сообщение об ошибке:
Referencing initializer 'init(with:)' on 'TestService' requires that 'String' conform to 'TestProtocol'
Что само собой разумеется.