Swift中的数据封装

时间:2014-06-08 05:19:23

标签: encapsulation swift

我已经阅读了整个Swift book,并观看了所有WWDC videos(我衷心推荐的所有内容)。我担心的一件事是数据封装。

考虑以下(完全做作的)示例:

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 );
    }
}

此类实现堆栈,并使用Array实现它。问题是,items(与Swift中的所有属性一样)是公共的,因此没有任何东西阻止任何人直接访问(甚至变异)它与公共API分开。作为一个蹩脚的老C ++人,这让我非常脾气暴躁。

我看到人们哀叹缺乏访问修饰符,虽然我同意他们会直接解决这个问题(我听说他们可能会实施Soon(TM)),我想知道一些数据隐藏策略是什么他们缺席。

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

3 个答案:

答案 0 :(得分:6)

此刻它根本就丢失了。 Greg Parker明确表示(in this dev forums thread)可见性修饰符即将到来。

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

好的一面是因为这个功能 处于不稳定状态,现在是file a radar的好时机,并影响其结果。

答案 1 :(得分:4)

更新了答案以供将来参考。

来自Apple的documentation

  

访问级别

     

Swift提供三种不同的访问级别   代码中的实体。这些访问级别是相对于   源文件,其中定义了实体,也相对于   源文件所属的模块。

     

公开访问可启用实体   可以在其定义模块的任何源文件中使用,也可以在   来自另一个导入定义模块的模块的源文件。   通常在指定公共接口时使用公共访问   到一个框架。

     

内部访问可以在任何实体中使用实体   来自其定义模块的源文件,但不在任何源文件中   在那个模块之外。您通常在使用时使用内部访问   定义应用程序或框架的内部结构。

     

私人访问   将实体的使用限制在其自己的定义源文件中。使用   私有访问隐藏特定部分的实现细节   功能。公共访问是最高的(限制最少)   访问级别和私有访问是最低的(或最严格的)   访问级别。

答案 2 :(得分:0)

事实上,我很高兴Swift最终采用静态类型,因此符合具有最佳OO属性的代码理论,但是标题的下降仍然打破了对象定位编程的非常强大,即封装。一个出路就像是埃菲尔自动提取标题,但没有指定哪些是公共接口,哪些是私有接口,它仍然是。我真的被苹果公司的这一举动所抨击。