有没有办法在Swift中覆盖“属性”设置器和getter?

时间:2015-04-01 16:23:23

标签: swift properties objective-c-swift-bridge

在阅读 @property/@synthesize equivalent in swift 后,我对目标C的功能如何保留感到好奇。

说我在目标C中有以下内容:

@interface MyClass
@property (readwrite) MyType *myVar;
@end

这可以通过基于点和小字符的语法来访问:

Type *newVar1 = myClassInstance.myVar;
Type *newVar2 = [myClassInstance myVar];

myClassInstance.myVar = newVar1;
[myClassInstance setMyVar: newVar2];

如果我想为那些getter / setter添加一些额外的功能,我可以这样做:

@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;

但我不知道如何自定义这些getter和setter。 是否存在Swift等效的Objective C @property覆盖?

1 个答案:

答案 0 :(得分:1)

在研究这个问题时,我实际上发现了我的答案,但仍然认为应该把它放在其他有同样问题的人身上。


是的,根据the Swift Programming Language documentation's page on Properties,getter和setter可以用与C#解决问题类似的方式制作:

class MyClass {
    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