Swift. 在内部协议中声明私有函数

7
我该如何实现类似以下代码的效果(无法编译):
internal protocol InternalPrivateMix {
    private func doPrivately()
    internal func doInternaly()
}

基本上,我想要一种承诺,确认类私下实现某些功能。这更多是为了自我文档化。我显然可以在我的类中实现这些函数,而不必正式遵循协议并编写描述每个类都应该实现此功能的文档。虽然如果我能更正式地向其他开发人员传达我的意图,那将是很好的。
编辑:我尝试在一个文件中实现两个协议,一个是私有的,一个是内部的,就像@creeperspeak建议的那样。然而,我无法在其他文件中符合私有协议,所以它不起作用。

根据苹果文档:如果您想为协议类型分配显式访问级别,请在定义协议的时候这样做。这使您能够创建仅可在特定访问上下文中采用的协议。协议定义中每个要求的访问级别都会自动设置为与协议相同的访问级别。您不能将协议要求设置为与其支持的协议不同的访问级别。这确保了所有协议要求都将在采用该协议的任何类型上可见。 - creeperspeak
2个回答

7

从苹果的文档中可以看出,似乎实现您想要做的唯一方法是实现两个协议 - 一个内部的,一个私有的,因为苹果声明“您不能将协议要求设置为与其所支持的协议的访问级别不同。”


我之前尝试过,但如果在文件B中,我无法遵守文件A中的私有协议。还有其他方法吗?就我所看到的,好像没有。 - user1264176
听起来你好像不想它成为一个私有协议。按照定义,“私有”意味着它不能从其他文件中访问。如果你真的希望私有协议只能从单个文件中访问,但你又希望另一个类可以继承它,那么你可以将其设置为fileprivate,并在同一文件中实现继承类的扩展来处理这个问题。 - creeperspeak
1
嗯,是的,我不想在'Swift'中使用私有协议。我希望能够在内部协议中标记函数为私有。但在当前的Swift版本中似乎无法实现。 - user1264176
@creeperspeak,你能否提供文档链接? - Subhajit Halder
@SubhajitHalder 编辑答案以包含链接。 - creeperspeak

1
你可以这样做:
protocol P {
    func int()
}

extension P {
    func int() {
        print("int()")
        priv()
    }
    private func priv() {
        print("priv()")
    }
}

这可能符合您的目的 - 我使用它。


这没有任何意义。我仍然可以访问init(),而且init()仍然会执行我不想做的事情。 - MacKa
目的是接受函数参数或变量定义中的 P 的人不能调用 priv,但是 P 的扩展程序的编写者可以。通常情况下,P 的编写者也是 P 的扩展程序的编写者。同意这有点奇怪,但这就是 Swift! - Howard Lovatt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接