2016-05-18 7 views
2

ブロック内の後で使用するために変数の現在の値を保存する方法はありますか?ブロックの変数の現在の値を取得する方法

たとえば、この遊び場コードのために:

import UIKit 
import XCPlayground 

XCPlaygroundPage.currentPage.needsIndefiniteExecution = true 

class testClass { 
    var i = 0 
    func test() { 
     let dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(Double(NSEC_PER_SEC)) * 5) 
     dispatch_after(dispatchTime, dispatch_get_main_queue(), { 
      self.test(self.i) 
     }) 
     i = 3 
    } 

    func test(i: Int) 
    { 
     print("i: \(i)") 
    } 
} 

let a = testClass() 
a.test() 

私が代わりにi: 3の出力i: 0を得る方法でdispatch_afterためiの現在の値を保存する方法はありますか?

答えて

4

あなたは、 式が評価されキャプチャリストで指定された値に任意の式をバインドすることができます。あなたのケースでは あなたはself.iをバインドします:

dispatch_after(dispatchTime, dispatch_get_main_queue(), { [i = self.i] in 
    self.test(i) 
}) 
+0

私は感謝、探していたまさに! – Daniel

3

iをキャプチャしてselfを参照しているため、ディスパッチ時に値が取得されます。関数の始めにそのまま値を取得したい場合は、変更する前にローカルコピーを取得する必要があります。クロージャが作成されたときに

let x = self.i 
    dispatch_after(dispatchTime, dispatch_get_main_queue(), { 
     self.test(x) 
    }) 
関連する問題