回答編集履歴

5

コードコメント変更

2018/03/09 10:31

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -74,9 +74,9 @@
74
74
 
75
75
  var a = _a
76
76
 
77
- return ( { (b: Int) -> Int in a + b },
77
+ return ( { (b: Int) -> Int in a + b }, // 複数のクロージャーで変数a
78
78
 
79
- { (b: Int) -> Void in a = b } ) // 文脈上に見えている変数変更できる
79
+ { (b: Int) -> Void in a = b } ) // を共有できる
80
80
 
81
81
  }
82
82
 

4

コード例がよくない点を訂正

2018/03/09 10:31

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -70,23 +70,19 @@
70
70
 
71
71
  ```swift
72
72
 
73
- func adder(_ _a: Int) -> [(Int) -> Int] {
73
+ func adder(_ _a: Int) -> ((Int) -> Int, (Int) -> Void) {
74
74
 
75
75
  var a = _a
76
76
 
77
- return [ { (b: Int) -> Int in a + b },
77
+ return ( { (b: Int) -> Int in a + b },
78
78
 
79
- { (b: Int) -> Int in a = b; return b } ]
79
+ { (b: Int) -> Void in a = b } ) // 文脈上に見えている変数を変更できる
80
80
 
81
81
  }
82
82
 
83
83
 
84
84
 
85
- let fs = adder(10)
85
+ let (add, set) = adder(10)
86
-
87
- let add = fs[0]
88
-
89
- let set = fs[1]
90
86
 
91
87
  print(add(2)) // 12
92
88
 

3

マークダウン変更

2018/03/09 10:28

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -68,7 +68,7 @@
68
68
 
69
69
 
70
70
 
71
- ```swfit
71
+ ```swift
72
72
 
73
73
  func adder(_ _a: Int) -> [(Int) -> Int] {
74
74
 

2

追記

2018/03/09 10:20

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -59,3 +59,39 @@
59
59
 
60
60
 
61
61
  クロージャーに名前がついていると勘違いされているが故の質問だと思います。名前がついているクロージャーっていうのはもはや単なる関数(メソッド)です。
62
+
63
+
64
+
65
+ ---
66
+
67
+ 追記:クロージャーを評価する際の「文脈」の機能を表す、ありがちな例を追記してみます。
68
+
69
+
70
+
71
+ ```swfit
72
+
73
+ func adder(_ _a: Int) -> [(Int) -> Int] {
74
+
75
+ var a = _a
76
+
77
+ return [ { (b: Int) -> Int in a + b },
78
+
79
+ { (b: Int) -> Int in a = b; return b } ]
80
+
81
+ }
82
+
83
+
84
+
85
+ let fs = adder(10)
86
+
87
+ let add = fs[0]
88
+
89
+ let set = fs[1]
90
+
91
+ print(add(2)) // 12
92
+
93
+ print(set(20)) // 20
94
+
95
+ print(add(2)) // 22 <=これに注目してほしい
96
+
97
+ ```

1

説明補足

2018/03/09 10:20

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -4,11 +4,11 @@
4
4
 
5
5
  解釈の仕方が違う気がします。
6
6
 
7
- クロージャは普通名前がついたものとしては捉えません。上記でどの部分かといえば、useClosure関数の中にあるexecClosure関数の引数`{ print(...); print(...); print(...) }`の部分です。
7
+ クロージャは普通名前がついたものとしては捉えません。上記でどの部分かといえば、useClosure関数の中にあるexecClosureメソッドを呼び出したとき引数`{ print(...); print(...); print(...) }`の部分です。
8
8
 
9
9
 
10
10
 
11
- 呼び出しはexecClosureの本体部分にある`closure()`ですね。
11
+ クロージャを呼び出している部分はexecClosureの本体部分にある`closure()`ですね。
12
12
 
13
13
 
14
14