![](/img/trans.png)
[英]How to get the value of the variable that is assigned in a closure (Swift)
[英]How can I get initial closure variable in Swift?
我想從閉包內部訪問變量的值。 但是我不想獲取更改后的變量,我想從初始關閉init中獲取值。
在Objective-C中,這沒有問題,因為每個“外部”變量都被復制並且可以像const
一樣進行訪問。 現在,每個變量的行為都類似於__block
var。
-編輯-
我創建了一個簡單得多的示例。 目標c中的一項有效,但迅速中的一項無效:
迅速:
var myQueue: dispatch_queue_t = dispatch_queue_create("com.mycompany.myqueue", DISPATCH_QUEUE_CONCURRENT);
for i in 0...200 {
let startDate = NSCalendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.CalendarUnitDay, value: (i+1)*(-1), toDate: NSDate.date(), options: NSCalendarOptions.MatchFirst)
dispatch_async(myQueue, {
println("\(i) - \(startDate.descriptionWithLocale(NSLocale.systemLocale()))")
})
}
快速輸出(數據“ bullshit”):
3 - 2014 M07 30, Wed 17:33:58 GMT+02:00
...
9 - 2014 M07 24, Thu 17:33:58 GMT+02:00
10 - 2014 M07 23, Wed 17:33:58 GMT+021:30 0-
1 12 0-11 442 0-M1 0427 0 1M12201410 76 7,- M 2-0-S22 7 u0,2 2n1 010 4T1911 u4,
目標c:
for (int i = 0; i < 200; i++) {
NSDate *startDate = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitDay value:(i+1)*(-1) toDate:[NSDate date] options:NSCalendarMatchFirst];
dispatch_async(myQueue, ^(void) {
NSLog(@"%d - %@", i, startDate);
});
}
目標c輸出:
2014-08-03 17:30:49.893 m7[92781:611495] 1 - 2014-08-01 15:30:49 +0000
2014-08-03 17:30:49.893 m7[92781:611494] 3 - 2014-07-30 15:30:49 +0000
2014-08-03 17:30:49.894 m7[92781:611496] 4 - 2014-07-29 15:30:49 +0000
2014-08-03 17:30:49.894 m7[92781:611498] 6 - 2014-07-27 15:30:49 +0000
2014-08-03 17:30:49.894 m7[92781:611497] 5 - 2014-07-28 15:30:49 +0000
2014-08-03 17:30:49.895 m7[92781:611495] 9 - 2014-07-24 15:30:49 +0000
...
我想在閉包內訪問startDate
。 但這是執行關閉之前的更改后的值,而不是初始值。
我能做什么?
只需在循環中為start / endDate使用局部變量 :
for i in 0...6 {
let startDate = calendar.dateByAddingUnit(NSCalendarUnit.CalendarUnitDay, value: (i+1)*(-1), toDate: today, options: NSCalendarOptions.MatchFirst)
let endDate = calendar.dateByAddingUnit(NSCalendarUnit.CalendarUnitDay, value: (i)*(-1), toDate: today, options: NSCalendarOptions.MatchFirst)
self.stepCounter.queryStepCountStartingFrom(startDate, to: endDate, toQueue: NSOperationQueue.mainQueue(), withHandler: {
(numberOfSteps: NSInteger , error: NSError!) in
println("steps: \(numberOfSteps)")
})
}
然后,每個迭代都有其自己的日期實例,並且捕獲的日期的值不會更改。
更新:另一個問題是Swift println()
函數不是線程安全的。 這會在您的示例中造成垃圾。 對於並發運行的線程的調試輸出,最好使用Swift中也提供的NSLog()
:
dispatch_async(myQueue, {
NSLog("%d - %@", i, startDate)
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.