在阅读 @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
覆盖?
答案 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
。