ご質問に挙げておられる例だけ眺めると、function内部の変数を外部から参照する必要はなく単に値を返せばよいように思えます。
もし文字通りブロック内部の変数を外部からアクセスするようにということならクロージャーを返せば実現はできると思います。
swift
1class Foo {
2 var a: Int!
3 var b: Int!
4
5 init(_ a: Int, _ b: Int) {
6 self.a = a;
7 self.b = b;
8 }
9
10 func foo() -> (Int, Int) {
11 let (ref, update) = bar()
12 let r1 = ref()
13 update()
14 let r2 = ref()
15
16 return (r1, r2)
17 }
18
19 func bar() -> (() -> Int, () -> ()) {
20 if a > b {
21 var ref = 100
22 return ({ () in ref }, { () in ref += 1 })
23 }
24
25 if a < b {
26 var ref = 200
27 return ({ () in ref }, { () in ref -= 1 })
28 }
29
30 return ({ () in 0 }, { () in })
31 }
32}
33
34let v1 = Foo(1, 2)
35let v2 = Foo(2, 1)
36let v3 = Foo(1, 1)
37print(v1.foo())
38print(v2.foo())
39print(v3.foo())
40
結果:
(200, 201)
(100, 99)
(0, 0)
ただ、可能なら上記のようなややトリッキーな方法よりは単に共通処理を関数化し以下のようにした方が素直で読みやすくなる気がします。
Swfit
1func foo() {
2 if a < b {
3 let ref = ... pattern 1 ...
4 bar(ref)
5 }
6
7 if a > b {
8 let ref = ... pattern 2 ...
9 bar(ref)
10 }
11
12 func bar(ref: DatabaseReference) {
13 ...
14 }
15}
16
17// あるいは
18
19func foo(operation: (dbr: DatabaseReference)->()) {
20 if a < b {
21 let ref = ... pattern 1 ...
22 operation(ref)
23 }
24
25 if a > b {
26 let ref = ... pattern 2 ...
27 operation(ref)
28 }
29}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。