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也有这个问题。这就是奇怪的前缀协议的由来。他们明白了;很难看。但是,它实际上并没有引起任何问题,它只是泄露了一些我们都希望它不会泄露的内部信息。