我目前正在研究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
}
}
}
答案 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,你也不需要它没有特定的条件/含义。定义它就像你的底层例子一样好