【发布时间】:2019-03-13 03:23:17
【问题描述】:
我正在寻找一种在扩展中编写私有函数的方法。
例如:
class A: UIViewController {
override viewDidLoad() {
privateFoo()
}
}
private extension A {
func foo() {
privateFoo()
}
private func privateFoo() { //Helper function for foo(), expected to be called inside the scope of this extension only
}
}
但是,即使我将 privateFoo() 声明为 private,我仍然可以从扩展外部调用它,这不是我所期望的。
你能帮我实现我的目标吗?
【问题讨论】:
-
显示一个您可能会意外调用
privateFoo()的示例。我所做的任何尝试都会按预期导致错误。 -
您是否在同一文件中定义的
A的其他扩展名中调用privateFoo?如果是这样,那么它按预期工作:“私有访问将实体的使用限制为封闭声明,以及同一文件中该声明的扩展”。来源:docs.swift.org/swift-book/LanguageGuide/AccessControl.html -
这是我在 Playground prntscr.com/mx40ab 中制作的屏幕截图。如您所见,privateFoo() 是在私有扩展中声明的,但我仍然可以在 viewDidLoad() 中调用它
-
@hoangCap Edit 您的问题显示了导致问题的实际代码。不要在评论中显示屏幕截图。
-
在我看来,如果你正在扩展类
A,你应该使用fileprivate,将扩展名存储在A的同一个文件中。如果您要扩展类UIViewController,则应使用public或internal(默认)。如果你想要一个真正私有的A方法,请将其放在A类中,而不是extension A