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 }
    }
}