Swift中的数据封装和安全性

时间:2017-06-08 18:19:22

标签: ios swift swift3 encapsulation

我目前正在研究Swift中的iOS开发,并且遇到了数据封装和安全性的概念。让我们从一个例子开始:

update bookmarks set data = data #- ?::text[] where owner = ?

{"root":[{"name":"stackoverflow","url":"http://stackoverflow.com", "description": "online coding community", "created_at":"2017-05-03"},{"name":"postgres","url":"http://www.postgresqltutorial.com/postgresql-inner-join/", "description": "online coding community", "created_at":"2017-05-03"}],"sample":[{"name":"stackoverflow","url":"http://stackoverflow.com",  "description": "online coding community", "created_at":"2017-05-03"},{"name":"w3schools","url":"https://www.w3schools.com/js/js_json_syntax.asp",  "description": "online coding community","created_at":"2017-05-03"}, {"name":"gmail","url":"https://mail.google.com",  "description": "e-mail", "created_at":"2017-05-03"}]}

在本教程中,为了安全起见,我被教导总是创建一个私有var,因此变量不能在外部过度而且会改变数据。教师还强调要像上面那样明确设置getter和setter。写getter和setter对我来说似乎非常麻烦,似乎我只需要在需要时使用getter和setter。 (即getter可用于只读属性,setter可用于Computed Property)。

我想知道我是否需要一直遵循这种做法,或者我是否可以简单地定义属性如下:

Class Person {
    private var _weight: Int!

    var weight: Int {
        get {
            return _weight
        }
        set {
            _weight = newValue
        }
    }
}

2 个答案:

答案 0 :(得分:6)

在Swift中,您不需要为所有属性声明显式的getter和setter,除非您想要自定义它们的行为。

大部分时间,这都可以正常工作:

class Person {
    var weight: Int
}

你甚至可以公开地将变量设为只读,并私下读写:

class Person {
    public private(set) var weight: Int
}

当你想要自定义getter和setter的行为时,你的教师的例子很有用,例如懒洋洋地从一些外部源获取数据:

class Person {
    private var _weight: Int!

    var weight: Int {
        get {
            if _weight == nil {
                //fetch _weight from somewhere
            }
            return _weight!
        }
        set {
            _weight = newValue
        }
    }
}

Private variables are not a security feature。转储对象的内存并从中提取私有变量是微不足道的,在许多语言中,您可以使用反射等功能更轻松地访问它们。

相反,私有变量用于封装。标记为private的变量意味着“这是一个内部接口,所以使用它。如果你使用它,它不能保证工作,即使现在有效,也可能不会在将来工作。“私有变量也可以允许编译器在某些情况下执行一些额外的优化,因为它知道除了在这个类声明中之外的任何地方都不会访问该变量。

答案 1 :(得分:1)

你的教授是正确的,但我认为你不需要在变量中添加_来强调它们是私有的,因为我们已经拥有了“私有” “选择快速。对于像python这样的语言,你不能设置像变量和函数私有的特定标识符。另外,如果你不操作它或者它不需要编写getter和setter,你也不需要它没有特定的条件/含义。定义它就像你的底层例子一样好