2016-08-29 8 views
2

私のプロパティでは、プロパティを返す前にそのプロパティに値を割り当てています。次にアクセスされるときには、それがnilであるかどうかをチェックして、それを再度割り当てるか、インスタンスを返すだけです。null-coalescing演算子と再​​生成可能なプロパティの代入の省略形ですか?

これは、私は今それをやっている方法です:

private var _myProp: MyInstance? 

public var myProp: MyInstance { 
    if _myProp == nil { 
     _myProp = MyInstance() 
    } 
    return _myProp! 
} 

これは以下のように非常に非スウィフトを見て、これを行うための、よりエレガントな方法を期待していました。例えば、C#に私はこれを行うことができます:

private var _myProp: MyInstance? 

public var myProp: MyInstance { 
    return _myProp ?? (_myProp = MyInstance()) 
} 

私はそれを割り当て解除できるようにプロパティを再生成可能できるようにしようとしているが、次回は再びインスタンスを作成しますアクセスされます。

スウィフトでは何か?あなたの回答の光で

+0

内部プロパティに 'nil'にリセットする必要がありますか? –

+1

'lazy var myProp = MyInstance()'はどうですか? - 編集:それはおそらくジョシュが考えていることでしょう。 –

+0

しかし、私が 'myProp = nil'をどこかで実行すると、正しいインスタンスが再生成されませんか?私はプロパティを再生成可能にしようとしているので、 'nil'にするとインスタンスを再び自動的に作成します。 – TruMan1

答えて

1
スウィフトで

同様の表記は次のようになります。

private var _myProp: MyInstance? 

public var myProp: MyInstance { 
    return _myProp ?? {_myProp = MyInstance(); return _myProp!}() 
} 

しかし、私は、それはそれを見ることが本当に多く、スウィフトのようなまたは共通だということを知らない...

あなたはこのパターンをたくさん使用している場合、それはこのように、ただ助けるためにグローバル関数を作成するには、おそらく最善です:

func retrieve<T>(_ property:inout T?, withDefault value:T)->T { 
    if property == nil { 
     property = value 
    } 
    return property! 
} 

次に、あなたのコードは次のようになります。

private var _myProp: MyInstance? 

public var myProp: MyInstance { 
    return retrieve(&_myProp, withDefault:MyInstance()) 
} 

私の経験では、関数は、一般に、他の人がカスタム演算子やオーバーロードよりも理解し、読み込み、デバッグするのが容易です。

+0

ゲッターを '突然変異 'とマークする必要があります。 –

+0

@JoshCaswell:それがクラスでない限り。 –

+0

ああ、それは本当です@MartinR。私の愚か者。 –

0

は、私は、これはこれを行うには、「swiftiest」方法だと思います:

private var _property: MyClass? = nil 
public var property: MyClass { 
    if let property = _property { 
     return property 
    } else { 
     let property = MyClass() 
     _property = property 
     return property 
    } 
} 

おそらくあなたが希望よりも、より冗長なのですが、それと引き換えに、私はそれはかなり明確だと思いますそれは任意のオプションを強制的にアンラップしません。

private var _myProp: MyInstance? 

public var myProp: MyInstance { 
    mutating get { 
     _myProp = _myProp ?? MyInstance() 
     return _myProp! 
    } 
} 

スウィフトの代入演算子はVoidに、いない割り当てられた値を評価することができますので、:

+0

私のクラスの内部では、 '_myProp'の割り当てを解除して' nil'にしたいのですが、このプロパティに外部からアクセスすると自動的にインスタンスが再作成されます。 – TruMan1

+0

パフォーマンス上の理由からですか?変数をリセットしたいだけならば、変数をvarにして、それをnilに設定するのではなく、新しいインスタンスに設定することができます。 – EmilioPelaez

+0

これは一般に公開されているので、私は消費者が変数を 'var'にすることで変数を変更することを許可したくありません。 – TruMan1

1

スウィフトは、あなたがそうのようなあなたのC#コードにやけに近くに得ることができるので、ヌル・合体演算子を持っていますreturnステートメントのためにそれを使用するだけです。

+2

しかし、プロパティが既に設定されていても、これは '_myProp = _myProp'という代入を行います。それが重要かどうかはわかりません。 –

関連する問題