2015-09-14 5 views
0

Пробовал некоторые вещи с помощью Protocl Inheritance в быстром темпе, когда я столкнулся с проблемой, когда он не компилируется, поскольку он утверждает, что «Parent не соответствует BaseParent», хотя я не могу потому что жизнь меня понимает, почему. Вероятно, вернуться к основам момент ... Во всяком случае, вот объяснение и код:Swift Protcol Inheritance Не компилируется

/* 
- To conform to 'BaseParent', you must have a var called 'child' that conforms to 'BaseChild' 
- 'Child' conforms to 'BaseChild' 
- 'Parent' has a property called 'child' which must conform to 'Child' and by extension, 'BaseChild' 
- Therefore, any element assigned to 'child', must conform to 'BaseChild' 
- Therefore, 'Parent' has a var called 'child' that conforms to 'BaseChild' 
- So why does 'Parent' not conform to 'BaseParent' 
*/ 

protocol BaseChild { /* some methods */ } 
protocol Child : BaseChild { /* some more methods */ } 

protocol BaseParent { 
    var child : BaseChild! {get set} 
} 

class Parent : BaseParent { 
    var child : Child! 
} 

Вероятно, некоторые из очевидных причин о протоколах, которые я пропускаю, но если кто-нибудь может пойти в детали, я ценящих это :)

+0

Поглотителя ОК, как вы возвращаете объект, который соответствует 'протокола BaseChild', но сеттер Безразлично 't матч. Вы не можете установить какой-либо объект, соответствующий «BaseChild», как ожидалось в «BaseParent», он ожидает, что любой объект будет соответствовать протоколу «Child». – redent84

+0

Конечно, имеет смысл. Добавьте его в качестве ответа, и я приму его, когда это позволит мне. – SeanCAtkinson

ответ

1

Поглотитель по child объявлены в Parent порядке, как он возвращает объект, который соответствует BaseChild! (потому что Child наследует от BaseChild). Но сеттер не соответствует объявлению родителя, так как он ожидает любого объекта, который соответствует протоколу BaseChild, но вы переопределяете только только те, которые также соответствуют протоколу Child.

В качестве временного решения, чтобы сохранить безопасность типа, вы можете создать свойство обертки в Parent классе:

protocol BaseChild { /* some methods */ } 
protocol Child : BaseChild { /* some more methods */ } 

protocol BaseParent { 
    var baseChild : BaseChild! {get set} 
} 

class Parent : BaseParent { 
    var baseChild: BaseChild! 
    var child : Child! { 
     get { return baseChild as! Child } 
     set { baseChild = newValue } 
    } 
} 
Смежные вопросы