【问题标题】:Extension method accessible only inside class扩展方法只能在类内部访问
【发布时间】:2018-02-02 13:18:24
【问题描述】:

如何在extension 中创建一个方法,并使其只能在类(或其子类)中访问,如private 方法,但在extension 内的另一个文件中声明?

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

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

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

我错过了什么吗?

我正在寻找类似 @​​987654328@ 或 classprivate 的内容。

【问题讨论】:

  • 你的动机是什么?为什么不在类本身内部创建一个私有方法呢?扩展的全部意义在于带来类所没有的额外功能并在任何地方使用它。
  • 你没有错过任何东西;目前这是不可能的。
  • @KeranMarinov 的动机是在不同的子类中重用该方法。
  • Java 为只能从子类访问的方法提供了受保护的关键字,不要认为 Swift 有它。我还建议,您可以使用具有默认实现的协议,而不是从单个类继承。

标签: swift extension-methods private access-control


【解决方案1】:

目前无法执行您所要求的操作,我同意这在某些情况下会非常有帮助。

假设我们有这个协议:

protocol HidableViewed {
    var hidableView: UIView
}

此协议用于表示某些视图控制器具有可以隐藏的视图(这在其业务案例中是有意义的)。

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

extension HidableViewed {
    func hideView() {
        self.hidableView.isHidden = true
    }
}

很好,很方便!

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

【讨论】:

    【解决方案2】:

    目前 Swift 3 由于扩展中的私有可访问性而存在一些问题。在 swift4 中,这将是可能的。你可以试试 Xcode 9 beta。

    【讨论】:

    • Swift 4 使私有属性对同一文件中的扩展可见,但对不同文件中的扩展不可见。除非我弄错了,否则 OP 所要求的在 Swift 4 中是不可能的。
    • @MartinR 完全正确!
    猜你喜欢
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多