Swift 协议继承不编译
Swift Protocol Inheritance Doesn't compile
在 swift 中使用 Protocl Inheritance 尝试一些不同的东西时,我遇到了一个问题,它没有像它声称的那样编译 "Parent does not conform to BaseParent",即使我不能终生我明白为什么。可能是返璞归真的时刻……
不管怎样,这里有一个解释和代码:
/*
- 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!
}
可能是我遗漏了一些关于协议的明显原因,但如果有人能提供更多细节,我将不胜感激:)
在 Parent
中声明的 child
的 getter 是可以的,因为它 returns 一个符合 BaseChild!
的对象(因为 Child
继承自 BaseChild
)。但是 setter 不符合父级的声明,因为它期望 any 符合 BaseChild
协议的对象,但是你压倒了期望 仅那些也符合Child
协议的。
作为保持类型安全的解决方法,您可以在 Parent
class:
中创建一个包装器 属性
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 }
}
}
在 swift 中使用 Protocl Inheritance 尝试一些不同的东西时,我遇到了一个问题,它没有像它声称的那样编译 "Parent does not conform to BaseParent",即使我不能终生我明白为什么。可能是返璞归真的时刻…… 不管怎样,这里有一个解释和代码:
/*
- 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!
}
可能是我遗漏了一些关于协议的明显原因,但如果有人能提供更多细节,我将不胜感激:)
在 Parent
中声明的 child
的 getter 是可以的,因为它 returns 一个符合 BaseChild!
的对象(因为 Child
继承自 BaseChild
)。但是 setter 不符合父级的声明,因为它期望 any 符合 BaseChild
协议的对象,但是你压倒了期望 仅那些也符合Child
协议的。
作为保持类型安全的解决方法,您可以在 Parent
class:
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 }
}
}