Swift 中的封装是否与其他 OO 语言中的封装一样重要

Is encapsulation in Swift as important as in other OO languages

当我学习其他语言如Java时,所有示例代码都告诉你应该始终标记一个字段private。并且执行内部操作的方法也被标记为 privateprotected.

但是当谈到Swift时,我看到很多教程(例如raywenderlich.com)的示例代码很少将某些内容标记为private。他们只是保留它 internal(不添加任何修饰符)。

相比之下,所有 android 教程都将某些字段标记为 private,并且不为它们提供 getter 或 setter。

例如,我前阵子看了这个搜索栏教程:

https://www.raywenderlich.com/113772/uisearchcontroller-tutorial

当我通读它的时候,我在想:"Why did you not mark this private?"

let searchController = UISearchController(searchResultsController: nil)

我的意思是,其他 类 访问 my VC 的搜索控制器没有任何意义。这是我的

问题:

为什么大多数(如果不是全部)教程都提供包含私有属性的示例代码?是因为 iOS 更安全还是什么?我应该在生产代码中将合适的东西标记为私有吗?

我希望这不是太基于意见。在Java,你永远不会做一个字段public,对吧?这只是一个事实——你不应该创建字段 public。所以请不要因为基于意见而关闭,它不是。

Java 和 Swift 之间的主要区别在于属性。

Java 没有属性的概念。它有字段,如果您想允许 public 访问这些字段,您可以直接访问它们或通过 getter/setter 方法访问它们。

如果您创建 public 以后需要保护的字段,您将不得不使用方法,因此您的 public API 将被更改 - 访问字段时没有括号和方法。

Swift 在这方面是不同的。您可以随时使用 getter/setter 保护您的现场访问权限,而无需更改 API。因此,如果您的字段是 public API 的一部分,您可以将其保留原样(不将其设为私有)并且无需附加 getter/setter 方法。

封装在Java和Swift中是同等重要的。不同之处在于它是如何实现(实施)的。由于在 Swift 中没有 过早封装 的压力,并且只是在适当的时候添加可见性说明符的问题 缺乏纪律 在教程代码中添加那些主要目的不是强制封装,而是教授一些其他概念和操作方法的代码。

为什么不是所有内容都是私有的?我见过几种非常常见的场景,它们总是倾向于使用内部变量或 public.

委托方法:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell     {
    let cell = tableView.dequeueReusableCellWithIdentifier(
        myCellID,
        forIndexPath: indexPath);
    return cell;
}

您不会在内部调用此方法,而是由管理和显示 tableView 的 iOS 系统调用。委派模式在 iOS 开发中广泛使用。

两个 ViewController 之间的数据交换,您只需设置另一个 ViewController 的字段:

class MyVC1: UIViewController {

   var flagShouldUpateColors = false {
      didSet{ 
            // some stuff
      }
   }


}

然后在某个时候你想通知此 ViewController 该标志应设置为 true。你这样做我只是访问它的字段。

还有选择器。当我为某些通知注册 ViewController 的实例时,我传递了我在同一个 ViewController 中拥有的方法的名称。通知触发时将调用它。代码基本上是 "please call this method for me when this occurs"。如果您说在发生这种情况时调用此 private 方法,那将没有意义吗?调用者应该如何调用它(除了反射和其他未优化的方式)。这是示例:

override func viewDidLoad() {
    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: #selector(self.doStuffWhenEnterForeground),
        name: UIApplicationWillEnterForegroundNotification,
        object: app)
    doStuffWhenEnterForeground();
}
func doStuffWhenEnterForeground() {

}

Why don't most, if not all tutorials provide sample code that contains private properties? Is it because iOS is more secure or something? Should I mark suitable stuff as private in production code?

可能是因为它更简单,减少了几次击键,并且不会为理解教程的主题增加不必要的开销。

Should I mark suitable stuff as private in production code?

是的,您应该出于与 Java 中相同的原因这样做。但是,请注意两件事:

  1. 没有protected
  2. Swift 中的访问修饰符与许多其他语言相比工作方式不同。 private 将对变量或函数的访问限制在声明它的文件中,无论谁将访问它们。因此,如果您在同一个文件中声明了 2 个 classes,它们都可以看到彼此的私有字段。另一方面,如果此扩展名在其他文件中,您甚至无法从 class 的扩展名中看到私有字段。一开始看起来很奇怪,你只需要习惯它。