0

@property/@synthesize に相当する swiftを読んだ後、Objective C の機能がどのように保持されているのか知りたくなりました。

Objective 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

( @property? のカスタム セッターも参照してください)

ただし、上記のリンクされた質問に対する受け入れられた回答は、Swift がプロパティとインスタンス変数を区別しないことを示しています。だから、私はSwiftで次のものを持っているとしましょう:

class MyClass {
    var myVar: MyType
}

私の知る限り、アクセスする唯一の方法myVarは次のとおりです。

var newVar1 = myClassInstance.myVar;

myClassInstance.myVar = newVar1;

しかし、これらのゲッターとセッターをカスタマイズする方法がわかりません。Objective C の@propertyオーバーライドに相当する Swift はありますか?

4

1 に答える 1

0

この質問を調査しているときに、実際に答えを見つけましたが、同じ質問を持つ他の人のためにここに置くべきだと考えました.


はい、Swift プログラミング言語のドキュメントの Properties に関するページによると、 C# が問題に取り組むのと同様の方法でゲッターとセッターを作成できます。

struct MyParentType {
    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を使用して計算されるプロパティはget独自のプロパティを簡単に実装でき、そのように選択した場合は を使用didSetできないことに注意してください。willSet

于 2015-04-01T16:23:23.263 に答える