回答編集履歴
2
追記
test
CHANGED
@@ -1,49 +1,15 @@
|
|
1
|
-
|
1
|
+
> (`Escaping Closures`は)**循環参照を起こす危険性がある**ので、
|
2
2
|
|
3
|
-
|
3
|
+
(プログラマにそれを意識させるために)クロージャーの中で親スコープを強参照するときは`self`をつける。
|
4
|
-
|
5
|
-
[**参考サイト**](https://qiita.com/mishimay/items/1232dbfe8208e77ed10e#self-%E3%81%8C%E5%BF%85%E8%A6%81)
|
6
4
|
|
7
5
|
|
8
6
|
|
9
|
-
|
7
|
+
> `self`を付けることが**循環参照を防ぐことに直結しているわけではなくて**、
|
10
8
|
|
11
|
-
|
9
|
+
コードの意図が明確になり、循環参照しないかにプログラマが意識を向けて書くようになる、
|
12
10
|
|
13
11
|
|
14
12
|
|
15
|
-
```swift
|
16
13
|
|
17
|
-
// scope_4関数は、scope_3関数から返されたクロージャを2回実行しています。
|
18
14
|
|
19
|
-
class Foo {
|
20
|
-
|
21
|
-
|
15
|
+
つまり、明示的な`self`には、**循環参照**が存在しないよう確認を促す役割がある。
|
22
|
-
|
23
|
-
var tete = 10
|
24
|
-
|
25
|
-
let closure = { tete += 1
|
26
|
-
|
27
|
-
print(tete)
|
28
|
-
|
29
|
-
}
|
30
|
-
|
31
|
-
return closure
|
32
|
-
|
33
|
-
}
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
func scope_4() {
|
38
|
-
|
39
|
-
let tutu = self.scope_3()
|
40
|
-
|
41
|
-
tutu()
|
42
|
-
|
43
|
-
tutu()
|
44
|
-
|
45
|
-
}
|
46
|
-
|
47
|
-
}
|
48
|
-
|
49
|
-
```
|
1
追記
test
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
(未解決に戻しました。)
|
2
|
+
|
1
3
|
**`self`をキャプチャすることを明示するため。**
|
2
4
|
|
3
5
|
[**参考サイト**](https://qiita.com/mishimay/items/1232dbfe8208e77ed10e#self-%E3%81%8C%E5%BF%85%E8%A6%81)
|