Я получаю ошибку компилятора от Swift 3.0.1, которая меня озадачила. Ошибка указывает, что существует двусмысленность в типе вычислимого свойства, но я не вижу, как это сделать.Неоднозначный вывод типа
У меня есть протокол Generic
с домом root
. Этот протокол имеет общее ограничение, которое root
должно быть подклассом типа Root
.
class Root { }
protocol Generic {
associatedtype RootType: Root
var root: RootType { get }
}
Я тогда определить расширение протокола, который гласит:
Если
Generic
подклассRoot
, вернутьself
изroot
собственности.
Так что в принципе: если это уже Root
, вы можете просто переслать self
.
extension Generic where Self: Root {
var root: Self {
return self
}
}
У меня также есть GenericWrapper
класса, который является подклассом Root
и оборачивает экземпляр Generic
(для выполнения операций Root
с Generic
прокси-сервером).
class GenericWrapper<T: Generic>: Root {
var generic: T
init(generic: T) {
self.generic = generic
}
}
Наконец, я определяю Specialised
протокол и расширение к ней, что гласит:
Если
Specialised
реализуетGeneric
, возвращаютGenericWrapper
изroot
собственности.
protocol Specialised { }
extension Specialised where Self: Generic {
var root: GenericWrapper<Self> {
get {
return GenericWrapper(generic: self)
}
}
}
Тогда, когда я пытаюсь реализовать класс, который реализует Generic
и Specialised
, я получаю эту ошибку.
class SpecialisedImplementation: Generic, Specialised {
// errors:
// Ambiguous inference of associated type 'RootType': 'GenericWrapper<SpecialisedImplementation>' vs. 'SpecialisedImplementation'
// Matching requirement 'root' to this declaration inferred associated type to 'GenericWrapper<SpecialisedImplementation>'
// Matching requirement 'root' to this declaration inferred associated type to 'SpecialisedImplementation'
}
Причина я запутался потому, что неоднозначность утверждает, что SpecialisedImplementation
класс соответствует требованию от расширения к Generic
когда Generic: Root
, но SpecialisedImplementation
не наследует от Root
, поэтому он не должен, конечно?
Я открыл ошибку для этого: https://bugs.swift.org/просмотр/SR-3145 –