я не могу получить следующий код для работы:Родитель-ребенок и наличие ObjC
@objc protocol Child { }
@objc protocol Parent {
var child: Child { get }
}
class ChildImpl: Child {
func doSomething() { }
}
class ParentImpl: Parent {
let child = ChildImpl()
// this would solve the problem, however can't access the ChildImpl members
// that are not part of the protocol
// let child: Child = ChildImpl()
// as well as this, however maintaining two properties is an ugly hack
// var child: Child { return childImpl }
// private let childImpl = ChildImpl()
}
Ошибки я получаю:
Playground execution failed: error: Tests.playground:3:7: error: type 'ParentImpl' does not conform to protocol 'Parent' class ParentImpl: Parent { ^
Tests.playground:4:9: note: candidate has non-matching type 'ChildImpl' var child = ChildImpl()
В принципе у меня есть два родителя ребенка протоколы, и два класса, которые реализуют два протокола. Но все же компилятор жалуется, что ChildImpl
не является Child
, что неверно.
я могу сделать ошибки уйти, если я использую соответствующий тип на Parent
protocol Parent {
associatedtype ChildType: Child
var child: ChildType { get }
}
, однако мне нужно иметь протоколы, доступные для Objective-C, а также должны иметь возможность ссылаться на child
, как фактический конкретный тип.
Есть ли решение для этого, которое не связано с переписыванием протоколов в Objective-C
или не добавляет повторяющихся деклараций свойств, чтобы избежать проблемы?
Связанный: [Swift Протокол наследования и протокол conformence выпуск] (Http: // StackOverflow.com/questions/40410884/swift-protocol-inheritance-and-protocol-conformence-issue) (см. также: [Протокол не соответствует самому себе?] (http://stackoverflow.com/questions/33112559/protocol-doesnt -conform к себе)). – dfri
См. [Этот вопрос и ответы] (http://stackoverflow.com/q/42561685/2976878) - одно возможное (но не особенно приятное) решение в вашем случае должно было бы определить свойство фиктивного типа 'Child!' To 'ParentImpl 'для удовлетворения требования протокола (а затем ваше фактическое свойство должно быть типа' ChildImpl! '). – Hamish
@ Хамиш, я тоже оценил этот подход, но, как вы сказали, это не очень приятно, и для этого требуется поддерживать два свойства с одинаковой ролью :( – Cristik