閱讀後@property/@synthesize equivalent in swift,我對如何保留Objective C的功能感到好奇。有沒有辦法在Swift中重寫「屬性」設置器和獲取器?
說我有在目標C以下:
@interface MyClass
@property (readwrite) MyType *myVar;
@end
這可以像這樣的訪問與點狀和Smalltalk-基於語法:
Type *newVar1 = myClassInstance.myVar;
Type *newVar2 = [myClassInstance myVar];
myClassInstance.myVar = newVar1;
[myClassInstance setMyVar: newVar2];
如果我想添加一些額外的我可以這樣做:
@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說,斯威夫特沒有屬性和實例變量之間進行區分。所以,說我在斯威夫特如下:
class MyClass {
var myVar: MyType
}
就我所知,訪問myVar
唯一的方法是這樣的:
var newVar1 = myClassInstance.myVar;
myClassInstance.myVar = newVar1;
但我不知道如何定製這些獲得者和制定者。 是否有與Objective C @property
重疊的Swift等價物?
說到'willSet' /'didSet',你有點混淆。您使用的'!'不是解包操作符 - 您聲明'myCustomFancyVar'是一個「隱式解包可選」,即可以具有「nil」值的變量。由於這些不需要初始化(它們默認爲'nil'),所以您不必將其設置爲默認值。但是如果你給它一個初始值或者使用了一個初始化器,你就不需要'!':struct S {var x:Int = 1 {willSet(newVal){println(「willSet:\(newVal)」)} didSet {println(「did set」)}}}; var s = S(x:5); s.x = 2' – 2015-04-01 17:43:46
@AirspeedVelocity謝謝! – 2015-04-01 18:09:45