【问题标题】:Swift Protocol Extension Where Self Is SubclassSelf 是子类的 Swift 协议扩展
【发布时间】:2017-04-24 13:08:54
【问题描述】:

是否可以实现一个协议或协议扩展,指定该协议仅用于类并且这些类具有超类?

如果是这样,我可以利用它来创建一个向下迭代类的超类的函数,以收集它们各自存储一个公共变量的所有数据吗?

换句话说,在下面的示例中,是否可以创建一个扩展来执行第二个 BaseType 扩展伪代码尝试执行的操作,从而在结尾处 allVals = ["core", "middle", "top"]

import Foundation

protocol BaseType: class {
  var data: [String] { get }
  var all: [String] { get }
}

extension BaseType {
  var all: [String] {
    return data
  }
}

// Is the intent of this extension realistic? 
extension BaseType where Self.super is BaseType {
  var all: [String] {
    return data + super.all
  }
}

class CoreDT: BaseType {
  var core: String = "core"
  var data: [String] { return [core] }
}


class MiddleDT: CoreDT {
  var middle: String = "middle"
  override var data: [String] { return [middle] }
}

class TopDT: MiddleDT {
  var top: String = "top"
  override var data: [String] { return [top] }
}

let allVals = TopDT().all

print(allVals)

【问题讨论】:

    标签: swift protocols superclass


    【解决方案1】:

    简单的答案是:

    你无法做到这一点。

    详细一:

    您只能通过在其之上实现 NSObjectProtocol 来实现在协议内部使用超类的功能。但是,从 Objective C 到 Swift 的桥接函数的问题就会出现。解决方案是使协议成为@objc 协议,但是您将无法使用默认实现对其进行扩展。

    【讨论】:

      猜你喜欢
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多