Swift 扩展方法只能在类内访问

Swift 扩展方法只能在类内访问,swift,extension-methods,private,access-control,Swift,Extension Methods,Private,Access Control,如何在扩展名中创建方法,并使其仅在类(或其子类)中可访问,就像私有方法一样,但在扩展名中的另一个文件中声明 private不起作用,因为它必须在同一声明中 fileprivate不起作用,因为它必须在同一个文件上 public或默认值将不起作用,因为它将从其他类可见 我错过什么了吗 我正在寻找类似于extensionprivate或classprivate的东西,由于扩展中的私有可访问性,目前swift3存在一些问题。在swift4中,这是可能的。您可以尝试使用Xcode 9 beta版。您所要

如何在
扩展名中创建方法,并使其仅在类(或其子类)中可访问,就像
私有方法一样,但在
扩展名中的另一个文件中声明

private
不起作用,因为它必须在同一声明中

fileprivate
不起作用,因为它必须在同一个文件上

public
或默认值将不起作用,因为它将从其他类可见

我错过什么了吗


我正在寻找类似于
extensionprivate
classprivate

的东西,由于扩展中的私有可访问性,目前swift3存在一些问题。在swift4中,这是可能的。您可以尝试使用Xcode 9 beta版。

您所要求的现在是不可能做到的,我同意在某些情况下它会非常有用

假设我们有这个协议:

protocol HidableViewed {
    var hidableView: UIView
}
此协议用于表示某个视图控制器有一个可以隐藏的视图(这在其业务案例中是有意义的)

那么,我们想要隐藏视图做什么呢?我们当然想隐藏它们,但隐藏操作在该协议的每个实例中都是相同的。因此,为了避免在每个视图控制器中重写隐藏方法,我们希望在协议中实现它一次

extension HidableViewed {
    func hideView() {
        self.hidableView.isHidden = true
    }
}
很好,多方便啊


但是有一个问题:如果视图控制器实现了这个协议,那么任何其他类都可以隐藏它的视图。在某些情况下,我们当然不希望这样,这就引出了最初的问题。

你的动机是什么?为什么不在类本身内部创建一个私有方法呢?扩展的全部目的是带来类所没有的额外功能,并在任何地方使用它;这在目前是不可能的。@KeranMarinov动机是在不同的子类之间重用该方法。Java为只能从子类访问的方法提供了关键字保护,但不认为Swift有。我还建议,您可以使用带有默认实现的协议,而不是从单个类中进行子类化。Swift 4使私有属性对同一文件中的扩展名可见,但对不同文件中的扩展名不可见。OP所要求的在Swift 4中是不可能的,除非我弄错了。@MartinR完全正确!