2015-04-01 77 views
0

閱讀後@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等價物?

回答

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

+1

說到'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

+0

@AirspeedVelocity謝謝! – 2015-04-01 18:09:45

相關問題