为啥 Swift 的访问修饰符默认不是私有的?

Posted

技术标签:

【中文标题】为啥 Swift 的访问修饰符默认不是私有的?【英文标题】:Why are Swifts access modifiers not private by default?为什么 Swift 的访问修饰符默认不是私有的? 【发布时间】:2018-02-20 08:13:31 【问题描述】:

我真的很想知道这背后的原因是什么。我发现很多时候我的代码(例如 IBActionsIBOutlets)都暴露在不应该出现的地方。

【问题讨论】:

从apple docs 开始,Swift 通过为典型场景提供默认访问级别来减少指定显式访问控制级别的需要。事实上,如果您正在编写单目标应用程序,您可能根本不需要指定显式访问控制级别。您可能需要阅读 默认访问级别 & 单目标应用程序的访问级别部分。 @nayem 你应该这样回答。 所以我想这是简单而不是安全? Swift 强烈支持安全而不是简单。 private 与安全无关。它是关于记录意图,在较小程度上是关于跨框架性能(但主要是关于意图 IMO)。调用 IBAction 没有什么不安全的;这只是不好的做法,private 甚至不会阻止您调用它,因为它已暴露于 ObjC。 Swift 团队的目的是让简单的程序保持简单,并且只迫使开发人员学习和使用新工具,因为他们的程序会从中受益。但它很少会为了实现这一目标而牺牲安全性。 【参考方案1】:

默认是internal,这意味着你可以访问同一个模块内的标识符,但不能访问它之外,这与例如如何非常相似。 Java 默认具有package private 访问权限。

您可以使用internal 实现良好的封装,但对于更严格的封装,您可以选择使用private

在此处阅读更多信息:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html

【讨论】:

以上是关于为啥 Swift 的访问修饰符默认不是私有的?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 JUnit 5 默认访问修饰符更改为 package-private

为啥类或接口不能接收私有或受保护的访问修饰符?

为啥 Java 反射 API 允许我们访问私有和受保护的字段和方法?这不会破坏访问修饰符的目的吗? [复制]

为啥 private(set) 在 Swift 中不起作用?

java命令行参数的默认访问修饰符是啥[关闭]

002访问修饰符public,private,protected,以及不写(默认)时的区别