来自Java/C++之类的语言,我们习惯于部分或抽象的类实现,例如
protocol ProtocolA {
func x()
func y()
}
// attempt to partially implement ProtocolA
class AbstractProtocolA: ProtocolA {
func x() { /* implementation */ }
// does not implement function y
}
class ConcreteA1: AbstractProtocolA {
func y() { /* implementation */ }
}
class ConcreteA2: AbstractProtocolA {
override func x() { /* implementation */ }
func y() { /* implementation */ }
}
Run Code Online (Sandbox Code Playgroud)
但这在Swift中是不可能的,在这种情况下我会得到编译错误Type 'AbstractProtocolA' does not conform to protocol 'ProtocolA'
...是否有另一种Swifty方法来覆盖这个OOD用例?
更新: 规避这种限制的方法是:
enum ProtocolAError: ErrorType {
case NotImplementedException(methodName: String)
}
class AbstractProtocolA: ProtocolA {
func x() { /* implementation */ }
func y() { throw ProtocolAError.NotImplementedException(methodName: "y") }
}
Run Code Online (Sandbox Code Playgroud)
但是在这里我们将设计/编程错误(即实例化抽象的AbstractProtocolA)转移到运行时而不是编译时.
您可以使用协议扩展创建协议的默认实现:
protocol ProtocolA {
func x()
func y()
}
extension ProtocolA {
func x() {
// Do something (or nothing) here as a default implementation
}
}
Run Code Online (Sandbox Code Playgroud)
希望它有效;)
PS:看看swift中面向协议的编程,这里有一些链接:https : //www.raywenderlich.com/109156/introducing-protocol-oriented-programming-in-swift-2 https://developer.apple. COM /录像/播放/ wwdc2015/408 /
归档时间: |
|
查看次数: |
1929 次 |
最近记录: |