2015-04-01 2 views
0

После прочтения @property/@synthesize equivalent in swift мне стало любопытно, как были сохранены функциональные возможности Objective C.Есть ли способ переопределить «свойства» сеттеров и геттеров в Swift?

Скажем, у меня есть следующие в Objective C:

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

Это можно обращаться, как например с dot- и 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 говорят, что Свифт не делает различия между свойствами и переменным экземпляром. Так, скажем, у меня есть следующие в Swift:

class MyClass { 
    var myVar: MyType 
} 

Насколько я знаю, единственный способ получить доступ к myVar как таковой:

var newVar1 = myClassInstance.myVar; 

myClassInstance.myVar = newVar1; 

Но я не знаю, как настроить эти геттеры и сеттеры. Является ли Swift эквивалентом Objective C @property переопределяет?

ответ

1

Изучая этот вопрос, я на самом деле оказался на моем ответе, но все же решил, что его нужно поставить для кого-то другого с тем же вопросом.


Да, согласно the Swift Programming Language documentation's page on Properties, методы получения и установки могут быть выполнены аналогично тому, как 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) ")} сделалSet {println ("did set")}}}; var s = S (x: 5); s.x = 2' –

+0

@AirspeedVelocity Спасибо! –

Смежные вопросы