有没有办法覆盖 Swift 中的 "property" setter 和 getter?
Is there a way to override "property" setters and getters in Swift?
看完@property/@synthesize equivalent in swift,我开始好奇Objective C的功能是如何保留的。
假设我在 Objective C 中有以下内容:
@interface MyClass
@property (readwrite) MyType *myVar;
@end
这可以通过基于点和 smalltalk 的语法来访问:
Type *newVar1 = myClassInstance.myVar;
Type *newVar2 = [myClassInstance myVar];
myClassInstance.myVar = newVar1;
[myClassInstance setMyVar: newVar2];
如果我想为那些 getters/setters 添加一些额外的功能,我可以这样做:
@implementation MyClass
- (MyType *) myVar
{
// do more stuff
return self._myVar;
}
- (void) setMyVar: (MyType *) newVar
{
self._myVar = newVar;
// do more stuff
}
@end
(另见Custom setter for @property?)
然而,the accepted answer to the above linked question 说 Swift 不区分属性和实例变量。所以,假设我在 Swift 中有以下内容:
class MyClass {
var myVar: MyType
}
据我所知,访问 myVar
的唯一方法是这样的:
var newVar1 = myClassInstance.myVar;
myClassInstance.myVar = newVar1;
但是我不知道如何自定义这些getters和setters。 是否有 Swift 等效于 Objective C @property
覆盖?
在研究这个问题时,我实际上偶然发现了我的答案,但仍然认为应该把它放在这里以供有相同问题的其他人使用。
是的,根据 the Swift Programming Language documentation's page on Properties,getter 和 setter 的创建方式与 C# 解决问题的方式类似:
struct MyParentType {
var myPlainVar: MyType = MyType()
var myCustomGetterVar: MyType {
// do more stuff
return self.myCustomGetterVar
}
var myCustomGetterSetterVar: MyType {
get {
// do more stuff
return self.myCustomGetterSetterVar
}
set {
// do stuff
self.myCustomGetterSetterVar = newValue
// do more stuff
}
}
var myCustomFancyVar: MyType? {
willSet {
// do stuff with newValue
}
// actual setting is done automatically, so no set{}
didSet {
// do more stuff with oldValue
}
}
}
请注意,具有 didSet
的变量必须是初始化的或可选的,并且不能具有 get
,因为使用 get
计算的属性可以轻松实现它们自己的 didSet
和 willSet
如果他们愿意的话。
看完@property/@synthesize equivalent in swift,我开始好奇Objective C的功能是如何保留的。
假设我在 Objective C 中有以下内容:
@interface MyClass
@property (readwrite) MyType *myVar;
@end
这可以通过基于点和 smalltalk 的语法来访问:
Type *newVar1 = myClassInstance.myVar;
Type *newVar2 = [myClassInstance myVar];
myClassInstance.myVar = newVar1;
[myClassInstance setMyVar: newVar2];
如果我想为那些 getters/setters 添加一些额外的功能,我可以这样做:
@implementation MyClass
- (MyType *) myVar
{
// do more stuff
return self._myVar;
}
- (void) setMyVar: (MyType *) newVar
{
self._myVar = newVar;
// do more stuff
}
@end
(另见Custom setter for @property?)
然而,the accepted answer to the above linked question 说 Swift 不区分属性和实例变量。所以,假设我在 Swift 中有以下内容:
class MyClass {
var myVar: MyType
}
据我所知,访问 myVar
的唯一方法是这样的:
var newVar1 = myClassInstance.myVar;
myClassInstance.myVar = newVar1;
但是我不知道如何自定义这些getters和setters。 是否有 Swift 等效于 Objective C @property
覆盖?
在研究这个问题时,我实际上偶然发现了我的答案,但仍然认为应该把它放在这里以供有相同问题的其他人使用。
是的,根据 the Swift Programming Language documentation's page on Properties,getter 和 setter 的创建方式与 C# 解决问题的方式类似:
struct MyParentType {
var myPlainVar: MyType = MyType()
var myCustomGetterVar: MyType {
// do more stuff
return self.myCustomGetterVar
}
var myCustomGetterSetterVar: MyType {
get {
// do more stuff
return self.myCustomGetterSetterVar
}
set {
// do stuff
self.myCustomGetterSetterVar = newValue
// do more stuff
}
}
var myCustomFancyVar: MyType? {
willSet {
// do stuff with newValue
}
// actual setting is done automatically, so no set{}
didSet {
// do more stuff with oldValue
}
}
}
请注意,具有 didSet
的变量必须是初始化的或可选的,并且不能具有 get
,因为使用 get
计算的属性可以轻松实现它们自己的 didSet
和 willSet
如果他们愿意的话。