は、以下のコード例を検討:スコーピングは、スウィフトの実行遅延にどのように影響しますか?
enum Counter {
case value(Int)
mutating func add(value: Int) {
// part A
var orig = self
defer { print("[part A] direct defer : ", value, "+", orig, "=", self) }
// part B
do {
var orig = self
defer { print("[part B] do block defer: ", value, "+", orig, "=", self) }
}
if case let .value(prev) = self {
self = .value(value + prev)
}
}
}
var c = Counter.value(0)
c.add(value: 10)
我々がintカウンタとして格納するために使用される一つのケースを有する単純なカウンタ列挙しています。関数add
は、value
を抽出したカウンタ値にself
で加算して更新します。そうでない場合、両方のものとどのような最終的な出力に加えなっているものの値のログを印刷 -
、part A
機能レベルでスコープれるディファー文における2つのprint
sがあり、そしてpart B
、ローカルdo
ブロック内スコープれますされます。
コードに基づいて、出力は両方とも延期されたprint
で同じに見えるはずです。ただし、それらは異なっています:
[part B] do block defer: 10 + value(0) = value(0)
[part A] direct defer : 10 + value(0) = value(10)
なぜ同じではありませんか?
ブロックdo
ブロックは自分自身をキャプチャし、それを早めに遅延させるか、この意図されたデザインと認識しておく必要があるものですか?
'defer'ブロックにはC++デストラクタセマンティクスがあり、それらはブロックを離れるポイント実行時に直ちに実行されます。あなたが見ている動作は設計によるものです。 – Mgetz