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

时间:2016-04-26 14:05:48

标签: ios swift encapsulation

当我学习Java等其他语言时,所有示例代码都告诉您应始终标记字段private。执行内部操作的方法也标记为privateprotected

但是当谈到Swift时,我发现很多教程中的示例代码(例如raywenderlich.com)很少标记为private。他们只留下internal(不添加任何修饰符)。

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

例如,我刚才读了这个搜索栏教程:

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

当我阅读它时,我在想:"为什么你没有标记这个private?"

let searchController = UISearchController(searchResultsController: nil)

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

问题:

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

我希望这不是基于意见的。在Java中,你永远不会公开一个领域,对吗?这只是一个事实 - 你不应该公开领域。所以请不要以意见为基础关闭,但事实并非如此。

3 个答案:

答案 0 :(得分:2)

为什么不一切私密?我见过几种非常常见的情况,总是倾向于将变量设置为内部变量或公共变量。

委托方法:

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

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

两个ViewControllers之间的数据交换,你只想设置另一个ViewController的字段:

class MyVC1: UIViewController {

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


}

然后在某些时候你想要通知这个ViewController,标志应该设置为true。你这样做我只是简单地处理它的领域。

也是选择者。当我为一些通知注册ViewController的实例时,我在同一个ViewController中传递了一个方法的名称。在通知触发时调用它。基本上代码所说的是“请在发生这种情况时为我调用此方法”。如果你说这发生时调用这个私有方法,它会没有意义吗?调用者应该如何调用它(除了反射和其他未经优化的方式)。这是一个例子:

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

}

答案 1 :(得分:1)

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

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

如果您创建以后需要保护的公共字段,则必须使用方法,因此您的公共API将被更改 - 无需使用parens和方法访问字段。

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

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

答案 2 :(得分:1)

  

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

可能因为它更简单,只需保存少量按键,并且不会增加不必要的开销来理解教程的主题。

  

我应该在生产代码中将合适的东西标记为私有吗?

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

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