有没有办法覆盖 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 计算的属性可以轻松实现它们自己的 didSetwillSet 如果他们愿意的话。