回答編集履歴

1

追記

2020/03/19 03:38

投稿

hoshi-takanori
hoshi-takanori

スコア7901

test CHANGED
@@ -11,3 +11,95 @@
11
11
 
12
12
 
13
13
  メソッド名を間違えないための有益なやり方は、メソッド名を入力するときに Xcode のコード補完機能を有効に使って、とりあえず mail と打って候補が現れるのを待つことです。
14
+
15
+
16
+
17
+ ---
18
+
19
+
20
+
21
+ この `_` の呼び名ですが、外部引数名の省略、でしょうか。探しても古い記事しか見当たらなかったので、解説を書きます。
22
+
23
+
24
+
25
+ まず、Swift の関数やメソッドを呼び出すときは、引数名が必要です。
26
+
27
+
28
+
29
+ ```swift
30
+
31
+ func add(x: Int, y: Int) -> Int {
32
+
33
+ return x + y
34
+
35
+ }
36
+
37
+ print(add(x: 1, y: 2))
38
+
39
+ ```
40
+
41
+
42
+
43
+ この引数名ですが、外部名と内部名に分けて書くことができます。
44
+
45
+ 次の関数では、x と y は外部引数名、a と b は内部引数名になります。
46
+
47
+
48
+
49
+ ```swift
50
+
51
+ func add(x a: Int, y b: Int) -> Int {
52
+
53
+ return a + b
54
+
55
+ }
56
+
57
+ print(add(x: 1, y: 2))
58
+
59
+ ```
60
+
61
+
62
+
63
+ さらに、外部引数名を `_` とすることで、呼び出し時に省略できるようになります。
64
+
65
+
66
+
67
+ ```swift
68
+
69
+ func add(_ a: Int, _ b: Int) -> Int {
70
+
71
+ return a + b
72
+
73
+ }
74
+
75
+ print(add(1, 2))
76
+
77
+ ```
78
+
79
+
80
+
81
+ というわけで、次のコードでは第一引数 controller の外部引数名を省略する、という意味になります。
82
+
83
+
84
+
85
+ ```swift
86
+
87
+ func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
88
+
89
+ ```
90
+
91
+
92
+
93
+ 以上は現在(Swift 3 以降)の仕様ですが、Swift 1, 2 の頃は、メソッドの第一引数はデフォルトで省略されるという特例がありました。つまり、
94
+
95
+
96
+
97
+ ```swift
98
+
99
+ func mailComposeController(controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
100
+
101
+ ```
102
+
103
+
104
+
105
+ のように controller の前に `_` がなくても controller: は省略されていたのですが、これは美しくないとして Swift 3 の時に仕様変更がありました。(おかげで Sift 2 → 3 の修正は面倒だった…。)