teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

回答追記

2018/03/07 12:17

投稿

toki_td
toki_td

スコア2850

answer CHANGED
@@ -11,4 +11,41 @@
11
11
  順番があとになってしまいましたが↑をふまえて、
12
12
  クロージャはUIAlertControllerが呼び出すわけですから、どんな引数を持つハンドラ(クロージャ)を受け取るかはAppleがUIAlertController/UIAlertActionを設計した段階であらかじめ決めておかないといけません。ですから、アプリがその引数を必要とするかしないかはわからないのです。
13
13
  そのため、あとからそれを使用するアプリ側は先の設計に合わせる必要があるので、未使用でもエラーにはなりません。
14
- アプリ側がそれを必要としないなら単純に_(アンダースコア)にしておけばいいですよ。
14
+ アプリ側がそれを必要としないなら単純に_(アンダースコア)にしておけばいいですよ。
15
+
16
+ **---------- 下の回答に対する追記です -------------------**
17
+
18
+ クロージャについてなんか思い違いをされているように思うのですが、クロージャはもともとオブジェクトですから以下のように変数として持つことができます。
19
+
20
+ ```Swift
21
+ let fun = {(action: UIAlertAction) in // クロージャをfunに代入
22
+ NSLog("Camera");
23
+ };
24
+
25
+ let cameraAction = UIAlertAction(title: "カメラ", style: .default, handler:fun)
26
+
27
+ fun(cameraAction) // こんな感じで呼び出せる
28
+ ```
29
+
30
+ ですから、UIAlertActionが渡したクロージャをそのまま持っていると思います。
31
+
32
+ UIAlertController内は実際の実装がどうなっているのかは知りませんが、以下のような感じだと思います。
33
+
34
+ ```Swift
35
+ var actions : [UIAlertAction] = []
36
+
37
+ func addAction(action:UIAlertAction)
38
+ {
39
+ actions.append(action)
40
+ }
41
+
42
+ func actionSelected(index:Int) // indexは選択されたアクションのインデックス
43
+ {
44
+ var action = actions[index];
45
+ action.handler(action) // ここで選択されたactionを引数としてアプリ側のクロージャが呼ばれる
46
+ }
47
+ ```
48
+
49
+ > 同じように _ に変えてしまっても良いのでしょうか?
50
+
51
+ Swiftだと未使用な引数は _ にしておけばコンパイラに未使用なのを明示することができるのでそれに合わせてもいいですし、クロージャの場合はactionでもエラーになりませんからどちらでもいいと思います。