回答編集履歴
1
回答追記
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でもエラーになりませんからどちらでもいいと思います。
|