Swift-内部执行公共协议

Swift-内部执行公共协议,swift,public,internal,swift-protocols,Swift,Public,Internal,Swift Protocols,假设我有一个协议,我需要公开。此外,我还有一个实现这个协议的类,但我希望以一种内部的方式。所以我想做一些类似的事情: public protocol CustomDelegate { func didLoad() } public class Foo { public var delegate: CustomDelegate? var internalDelegate: CustomDelegate? ... } public class Bar { var foo: F

假设我有一个协议,我需要公开。此外,我还有一个实现这个协议的类,但我希望以一种内部的方式。所以我想做一些类似的事情:

public protocol CustomDelegate {
  func didLoad()
}

public class Foo {
  public var delegate: CustomDelegate?
  var internalDelegate: CustomDelegate?
  ...
}

public class Bar {
  var foo: Foo
  init() {
    self.foo = Foo()
    self.foo.internalDelegate = self
  }
}
extension Bar: CustomDelegate {
  func didLoad() {
    print("bar has loaded")
  }
}
这不起作用,因为
Bar
CustomDelegate
的实现是内部的,而
CustomDelegate
是公共的。然而,我只关心内部使用的扩展,所以事情应该是好的。换句话说,我希望这个扩展是一个内部扩展,就像类是内部扩展一样,但是Swift强制它是公共的。一种愚蠢的方法是在内部协议中复制协议,如下所示:

public protocol CustomDelegate {
  func didLoad()
}
protocol InternalCustomDelegate {
  func didLoad()
}

public class Foo {
  public var delegate: CustomDelegate?
  var internalDelegate: InternalCustomDelegate?
}

public class Bar {
  var foo: Foo
  init() {
    self.foo = Foo()
    self.foo.internalDelegate = self
  }
}
extension Bar: InternalCustomDelegate {
  func didLoad() {
    print("bar has loaded")
  }
}

但这太糟糕了。有更好的方法吗?

是的,公共协议的实现必须是公共的。这是目前的限制。它不会造成实际问题,但绝对会泄漏更多。这就是斯威夫特3号的状态。不要做疯狂的工作来避免它。注意,即使是stdlib也有这个问题。这就是奇怪的前缀协议的由来。他们明白了;很难看。但是,它实际上并没有引起任何问题,它只是泄露了一些我们都希望它不会泄露的内部信息。是的,公共协议的实现必须是公开的。这是目前的限制。它不会造成实际问题,但绝对会泄漏更多。这就是斯威夫特3号的状态。不要做疯狂的工作来避免它。注意,即使是stdlib也有这个问题。这就是奇怪的前缀协议的由来。他们明白了;很难看。但是,它实际上并没有引起任何问题,它只是泄露了一些我们都希望它不会泄露的内部信息。