2016-12-09 5 views
0

これはかなりシンプルですが、私は何か不足していると確信しています。変数内にコードブロックを保存する

私は以下を達成する方法を理解しようとしています。actionは、コードブロックを「ホールド」して、最終的にUIView.animate(たとえば)内で実行する必要があります。

正しい方法はありますか? + action閉鎖中に保持サイクルの面でself.を使用することについて心配する必要がありますか?

サンプル機能:

func forward(_ sender : UIButton) { 

var action : <Clousre of somekind?> 

switch currentPosition 
    { 
    case 0 : action = { self.view.background = .red } 
    case 1 : action = { self.view.background = .blue } 
    default : fatalError("No current Position") 
    } 

UIView.animate(withDuration: 1, animations: { 
    action 
    }) 
} 

ありがとう! :)

答えて

1

はこのようにそれを宣言します。何のサイクルを維持するには、

var action:() -> Void 

はありません。

selfは、actionへの参照を保持しません。

actionが保持サイクルが存在することになる(関数外)プロパティであろう場合:

self.action < - >action = { self... }

一緒に入れ:

var action :() -> Void 

switch currentPosition { 
    case 0 : action = { /*do something*/ } 
    case 1 : action = { /*do something*/ } 
    default : fatalError("No current Position") 
} 

UIView.animate(withDuration: 1, animations: { 
    action() 
}) 

// or 

UIView.animate(withDuration: 1, animations: action) 

は(の微細コンパイルプレイグラウンド)

+0

しかし、私はスイッチのスコープ内にのみ割り当てているので、最初は外に宣言しています。彼のタイプは何ですか?別名varアクション:!? –

+0

更新された回答。 – shallowThought

+0

私にエラーを返します: 'Void!'を返すと予想されるクロージャーでの返品がありません。 –

0

あなたの行動はパラメータを取らず何も返しません

var action: (() ->()) 
// or, if you want action to be optional: 
var action: (() ->())? 

EDIT::私はもともと私がactionが関数内で宣言された気付かなかったとしてサイクルを維持避けるために[weak self]を使用する必要があることを書いたので、彼らはタイプであることでしょう。関数内にあるので、関数が完了するとactionは割り当てを解除するので、保持サイクルはありません。

+0

保持サイクルの問題に対処してくれてありがとう。いいね!唯一の問題はブロック内で、私は 'commonHeight:CGFloat! = 171しかし、私が閉鎖の内部でそれを扱っているとき、aka:self?.commonHeight。それは私にエラーを与える:オプションの型の値 'CGFloat?'アンラップされていない。あなたは '!'を使うつもりでしたか?または '?'? 。何か案は? –

+0

「弱い自己」を行う理由は、「自己」の割り当てを解除できるようにするためです。自己が割り当てが解除されている(つまり何も指していない)場合、自己はそこにはありません。 'if let wSelf = self {...}'のようなものでブロック内の 'self'をアンラップすることも、' if let height = self?.commonHeight {...} 'でフロートをアンラップすることもできます。 – Connor

+0

shallowThoughtはちょうど保持サイクルがないことを正しく指摘しました。私は 'アクション'が関数の中にあったことに気付かなかった。 – Connor

関連する問題