У меня есть общий протокол:
protocol GenericProtocol {
associatedtype GenericParameter
}
Я не могу использовать это так:
var someValue: GenericProtocol?
Я получаю сообщение об ошибке, которое мы все хорошо знаем:
Протокол 'GenericProtocol' может использоваться только в качестве общего ограничения, поскольку он имеет требования к Self или связанный тип
Много раз столкнувшись с этой ошибкой и потратив долгое время на размышления над концептуальной причиной этой ошибки, я думаю, что я по крайней мере несколько понял ее. Чего я не понимаю, так это того, почему я не могу создать протокол, который наследует и специализирует мой универсальный протокол так, чтобы его можно было использовать в сигнатурах типов. Вот протокол наследования:
protocol ConcreteProtocol: GenericProtocol where GenericParameter == Bool { }
Но даже это я не могу использовать в сигнатуре типа:
var someValue: ConcreteProtocol?
Протокол 'ConcreteProtocol' может использоваться только в качестве общего ограничения, поскольку он имеет требования к Self или связанный тип
Не понимаю ли я, что означает where
? Какова концептуальная причина того, что даже ограниченные подпротоколы должны рассматриваться как общие? Я уверен, что это не ошибка, а скорее целенаправленный факт языка, известного сообществу Swift. Кто-нибудь может мне это объяснить?
Также, если бы кто-нибудь мог предоставить способ, которым я могу достичь того, чего я хочу, это было бы очень ценно, хотя я не уверен, что это возможно.