【发布时间】:2023-03-26 12:40:01
【问题描述】:
我正在研究我们应该对属性使用 Get 和 Set 的原因。
我注意到了 3 个主要原因
- 当您想在实际设置之前做/检查某事时 财产
- 当你想拥有一个只能从中获取的属性时 (我猜可能是出于安全目的?),或者给它不同的访问权限 级别。
- 在暴露属性的同时隐藏属性的内部表示 使用替代表示的属性。 (对我来说不是 很有意义,因为我可以使用在错误的地方访问它 无论如何设置函数)
下面的代码是一个示例,说明如何利用我提到的这 3 点在 Swift 中为属性实现 Get 和 Set:
class Test
{
private var _testSet:String!
private var _testGetOnly:String
var testSet:String{
get{
return _testSet
}
set{
_testSet = newValue + "you forgot this string"
}
}
var testGetOnly:String!{
get{
return _testGetOnly
}
}
init(testSet:String, testGetOnly:String)
{
_testSet = testSet
_testGetOnly = testGetOnly
}
}
但下面的另一个示例也利用了提到的这些点,但我没有使用另一个计算属性来返回私有属性值,而是使用 willSet 和 didSet 观察者
class Test
{
var testGet:String {
willSet{
fatalError("Operation not allowed")
}
}
var testWillSet:String!{
didSet{
self.testWillSet = self.testWillSet + "you forgot this string"
}
}
init(testGet:String, testWillSet:String)
{
self.testGet = testGet
self.testWillSet = testWillSet
}
}
所以我很想知道每种实现的优点和缺点是什么。
提前致谢
【问题讨论】:
-
非常有趣的问题,但我帮不了你,因为已经发现了暴徒......
-
willSet 和 didSet 是观察者。它们与 getter/setter 完全不同。 (甚至不要提到 Swift 中的属性(例如协议扩展中)通常甚至不是属性,它们是计算属性。)在回答您的问题时,是的,无论如何,这两个观察者都是如此出色的语言功能,通常情况下,您不必费心不再使用乏味的属性/getter/setter 模式 - 太好了。
标签: swift oop get set computed-properties