2016-05-09 6 views
0

同じコードを何度も何度も繰り返さないように、計算されたプロパティをテンプレートする方法はありますか?例えば、今、私はこのようなコードのブロックを持つクラスがあります。スウィフト計算済みプロパティテンプレート?

private var _state:State? 
private var _maxs:State? 
private var _state1s:State? 
private var _state10s:State? 

var state:State? { 
    get { 
     dispatch_semaphore_wait(statephore, DISPATCH_TIME_FOREVER) 
     let s=_state 
     dispatch_semaphore_signal(statephore) 
     return s 
    } 
    set { 
     dispatch_semaphore_wait(statephore, DISPATCH_TIME_FOREVER) 
     _state=newValue 
     dispatch_semaphore_signal(statephore) 
     if newValue != nil {statsTest(newValue!)} 
    } 
} 

var maxs:State? { 
    get { 
     dispatch_semaphore_wait(maxphore, DISPATCH_TIME_FOREVER) 
     let m=_maxs 
     dispatch_semaphore_signal(maxphore) 
     return m 
    } 
    set { 
     dispatch_semaphore_wait(maxphore, DISPATCH_TIME_FOREVER) 
     _maxs=newValue 
     dispatch_semaphore_signal(maxphore) 
    } 
} 


var state1s:State? { 
    get { 
     dispatch_semaphore_wait(state1sphore, DISPATCH_TIME_FOREVER) 
     let s=_state1s 
     dispatch_semaphore_signal(state1sphore) 
     return s 
    } 
    set { 
     dispatch_semaphore_wait(state1sphore, DISPATCH_TIME_FOREVER) 
     _state1s=newValue 
     dispatch_semaphore_signal(state1sphore) 
    } 
} 

var state10s:State? { 
    get { 
     dispatch_semaphore_wait(state10sphore, DISPATCH_TIME_FOREVER) 
     let s=_state10s 
     dispatch_semaphore_signal(state10sphore) 
     return s 
    } 
    set { 
     dispatch_semaphore_wait(state10sphore, DISPATCH_TIME_FOREVER) 
     _state10s=newValue 
     dispatch_semaphore_signal(state10sphore) 
    } 
} 

をここで明らかなパターンがありますし、すべての繰り返しのコードだけで何が起こっているのか分かりにくく、私はカットとエラーにつながっています/ペースト/編集/失敗。このパターンをキャプチャして、次にプロパティを定義する方法はありますか?

var state=ProtectedValue(_state,statephore) 

+0

防止すべきリソースの競合がありませんようあなたは、あなたのゲッターでセマフォを必要としません。 – Alexander

+0

Swift 3の動作が起こっている可能性があります(https://github.com/apple/swift-evolution/blob/master/proposals/0030-property-behavior-decls.md) – Kevin

+0

@AMomchilov、この場合の状態は次のとおりです。非同期キュー間で共有されるため、インタフェースを保護する必要があります。それを処理するための最良の方法であるかどうかをまだ知っていますが、私の質問のポイントは、ほぼ同じアクセスパターンを共有する複数のプロパティのアイデアが頻繁に出現するように見えるということです。 – Omegaman

答えて

1

これはジェネリックの仕事のようで、inoutの変数のようです。呼び出しサイトで

func setProtectedValue<T>(inout destination: T, newValue: T, semaphore: SemaphoreType) { 
     dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) 
     destination = newValue 
     dispatch_semaphore_signal(semaphore) 
} 

var state10s:State? { 
    get { 
     //... 
    } 
    set { 
     setProtectedValue(&_state10s, newValue, state10sphore) 
    } 
} 
+0

おっと、私は間違って '_state10s ='を入れていませんでした。私の更新された答えを見てください。それはセッターの呼び出しごとにちょうど1つの待機を引き起こす必要があります – Alexander

+0

おかげで、まだ私は好きではないが、おそらく私は近くに行動や何かが似通ってくるまではきれいにきれいではありません。 – Omegaman

+0

私は、セマフォとそれを保護するデータをカプセル化する汎用構造体を作成します。 – Alexander

関連する問題