【问题标题】:Inheritence in swift protocolsswift 协议中的继承
【发布时间】:2017-06-23 08:17:02
【问题描述】:

如何在 swift (2.0) 中解决这种情况:我们有两个协议:

protocol SuperDelegate{
     func handleSuccess(rsp: BaseRsp)
}

protocol ChildOfSuperDelegate: SuperDelegate {
    func handleSuccess(rsp: ChildOfBaseRsp)
}

以及我们想要做的代码中的某个地方:

class A{
    var delegate:SuperDelegate?

    func foo(){
        delegate?.handleSuccess(childOfBaseRspObj)
    }
}

class Xyz:ChildOfSuperDelegate{
     func handleSuccess(rsp: ChildOfBaseRsp){
        print("Great!")
     } 
}

但是编译器没有在协议中建立继承(handleSuccess 具有基参数和子参数的功能)存在编译错误:

Type 'Xyz' does not conform to protocol 'SuperDelegate'

。如何解决它们?仅实现 ChildOfSuperDelegate 方法但类“A”使用 SuperDelegate 变量的最佳方法是什么。

我必须使用泛型类型才能在协议中进行一些继承。

【问题讨论】:

  • 协议参数的参数类型不同
  • 你的delegate 说它有一个方法handleSuccess 接受BaseRsp,但是Xyz 说它只能 接受ChildOfBaseRsp .这不可能安全地工作。 Xyz 根本不满足func handleSuccess(rsp: BaseRsp) 的要求。
  • 我知道。但是怎么解决呢,我肯定有superDelegate,还有一些想像协议中的继承,泛型Types是不是个好主意?
  • 使类型相同。
  • 我怀疑你是否使用了一个好的方法。我认为在这种情况下最好使用协议扩展,以避免继承并获得类似“抽象类”的行为。这里提到:stackoverflow.com/questions/24110396/…

标签: swift swift-protocols


【解决方案1】:

这里你的协议 ChildOfSuperDelegate 是从 SuperDelegate 继承的,虽然它是一个协议,但它没有实现它的方法。但是当你从 ChildOfSuperDelegate 继承时,你必须实现 SuperDelegate 的方法以及 ChildOfSuperDelegate。

所以这样做:

class Xyz:ChildOfSuperDelegate{
  func handleSuccess(rsp: BaseRsp) {
    //do stuff 
  }

func handleSuccess(rsp: ChildOfBaseRsp){
     print("Great!")
  }
}

【讨论】:

  • 我知道。这不是我要找的。我想用 poliformism 调用协议函数,f.ex:delegate.handleSuccess(rspChildOfBaseRspObj) or delegate.handleSuccess(anotherChild) 但我的委托是对象实现 SuperDelegate(仅)。所以问题是为什么协议没有多态方法以及什么是walkarounds
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多