После прочтения @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
переопределяет?
Вы немного перепутаны, когда дело доходит до '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' –
@AirspeedVelocity Спасибо! –