2014-06-08 83 views
6

我读过整个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™),但我想知道数据隐藏的一些策略是什么在他们的缺席。

我错过了什么,或者这只是在语言中的遗漏?

+0

可能的重复:http://stackoverflow.com/q/24003918/1639670 – nathan

+0

有一种实际的一半做某种数据隐藏 - 协议。只要让你的课程符合你的协议,就可以使用所有功能和你想要被外部世界看到的东西,并且通过它而不是课程本身。正如我所说这不是替代品,但将工作,直到可见性修饰符出局。此外,这是一个很好的设计模式 - 依赖注入 –

+0

“所以没有任何东西可以阻止任何人直接访问(甚至突变)它与公共API分开” - 除了是一个“蹩脚的老C++人”:-)你有什么伤害如果你不强行阻止人们按照他们想要的方式使用你的代码,会不会认为会发生?例如,Python有一句话:“我们都是成年人。”公/私是基于文件和惯例。如果有人想捣鼓班级内部的某些东西,请注意空手道。没有人假装他们可以永远知道,没有人会有一个很好的理由来访问一个内部对象。 – alcalde

回答

6

它现在只是缺少。格雷格帕克明确表示(in this dev forums thread),可见性修改器即将到来。

鉴于没有标题,标准的Objective-C技巧将无法正常工作,我想不出另一个限制可见性的技巧,它不涉及大量向后弯曲。由于语言功能已被承诺,我不确定这是值得任何大的投资。

由于这个特点在光通量方面的好处,现在是file a radar的好时机,并影响它的结果。

0

事实上,我很高兴Swift最终采用了静态类型,所以符合最优OO属性的代码理论,但头文件的下降打破了面向对象编程(即封装)的良性。对于埃菲尔来说,一种解决方法就是自动提取标题,但不指定哪些是公共接口以及哪些是私有接口,这将是一件好事。我对Apple的这一举动非常吝惜。

4

更新的答案供将来参考。

从苹果公司的documentation

访问级别

斯威夫特为您的代码中 实体三种不同的访问级别。这些访问级别与定义实体的源文件相关,也相对于源文件所属的 模块。

公共接入使实体 从一个导入定义模块另一个模块从他们的定义模块的所有源文件中使用,也 源文件。 通常在将公共接口 指定给框架时使用公共接口。

内部访问使得能够从他们的定义模块任何 源文件中所使用的实体,但不以任何源文件 该模块的外部。当您定义应用程序或框架的内部结构时,您通常使用内部访问。

私人访问 限制使用实体到自己定义的源文件。使用 私有访问来隐藏特定片段的实现细节 的功能。公共访问是访问级别最高(限制最少) ,私有访问是访问级别最低(或限制最多) 。