Swift:如何进行协议(接口)的部分类实现?

Sky*_*ker 2 oop ios swift

来自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)转移到运行时而不是编译时.

jav*_*azo 6

您可以使用协议扩展创建协议的默认实现:

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 /