我读过整个Swift book,并观看了所有WWDC videos(我衷心推荐的所有内容)。我担心的一件事是数据封装。Swift中的数据封装
考虑以下(完全做作)例如:
class Stack<T>
{
var items : T[] = []
func push(newItem: T) {
items.insert(newItem, atIndex: 0)
}
func pop() -> T? {
if items.count == 0 {
return nil;
}
return items.removeAtIndex(0);
}
}
此类实现一个栈,以及使用数组实现它。问题是,items
(就像Swift中的所有属性)是公共的,所以没有任何东西可以阻止任何人直接访问(甚至是变异)它与公共API分离。作为一个古怪的C++老手,这让我非常暴躁。
我看到有人抱怨缺乏访问修饰符,虽然我同意他们会直接解决这个问题(并且我听到有传言说他们可能会实现Soon™),但我想知道数据隐藏的一些策略是什么在他们的缺席。
我错过了什么,或者这只是在语言中的遗漏?
可能的重复:http://stackoverflow.com/q/24003918/1639670 – nathan
有一种实际的一半做某种数据隐藏 - 协议。只要让你的课程符合你的协议,就可以使用所有功能和你想要被外部世界看到的东西,并且通过它而不是课程本身。正如我所说这不是替代品,但将工作,直到可见性修饰符出局。此外,这是一个很好的设计模式 - 依赖注入 –
“所以没有任何东西可以阻止任何人直接访问(甚至突变)它与公共API分开” - 除了是一个“蹩脚的老C++人”:-)你有什么伤害如果你不强行阻止人们按照他们想要的方式使用你的代码,会不会认为会发生?例如,Python有一句话:“我们都是成年人。”公/私是基于文件和惯例。如果有人想捣鼓班级内部的某些东西,请注意空手道。没有人假装他们可以永远知道,没有人会有一个很好的理由来访问一个内部对象。 – alcalde