Swift 中的封装是否与其他 OO 语言中的封装一样重要
Is encapsulation in Swift as important as in other OO languages
当我学习其他语言如Java时,所有示例代码都告诉你应该始终标记一个字段private
。并且执行内部操作的方法也被标记为 private
或 protected
.
但是当谈到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 中相同的原因这样做。但是,请注意两件事:
- 没有
protected
。
- Swift 中的访问修饰符与许多其他语言相比工作方式不同。
private
将对变量或函数的访问限制在声明它的文件中,无论谁将访问它们。因此,如果您在同一个文件中声明了 2 个 classes,它们都可以看到彼此的私有字段。另一方面,如果此扩展名在其他文件中,您甚至无法从 class 的扩展名中看到私有字段。一开始看起来很奇怪,你只需要习惯它。
当我学习其他语言如Java时,所有示例代码都告诉你应该始终标记一个字段private
。并且执行内部操作的方法也被标记为 private
或 protected
.
但是当谈到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 中相同的原因这样做。但是,请注意两件事:
- 没有
protected
。 - Swift 中的访问修饰符与许多其他语言相比工作方式不同。
private
将对变量或函数的访问限制在声明它的文件中,无论谁将访问它们。因此,如果您在同一个文件中声明了 2 个 classes,它们都可以看到彼此的私有字段。另一方面,如果此扩展名在其他文件中,您甚至无法从 class 的扩展名中看到私有字段。一开始看起来很奇怪,你只需要习惯它。