質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

244閲覧

引数のある関数を変数に代入し、変数を呼び出す時には、引数名が必要ないのはなぜでしょうか。

prtk1206

総合スコア7

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/08/22 09:46

###前提・実現したいこと
swiftで初めてプログラミングを勉強しています。
引数のある関数を呼び出す際には、 引数名が基本的には必要だと思いますが、
その関数を変数に代入し、変数を呼び出す(?)際には引数名が必要ないのはなぜでしょうか?
また、変数に関数を代入したらその変数は関数と呼ぶのでしょうか?
初めての質問でteratailのルール違反などがございましたらご指摘ください。

###該当のソースコード

swift

1func multiply(a:Int,b:Int) -> Int { 2 return a * b 3} 4 5multiply(a:3,b:4) // 関数を呼び出すには引数名が必要。 6 7var math = multiply //関数を変数に代入。 8math(3,4) // 変数を呼び出す際には引数名が不要。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

multiplyの型は(Int, Int) -> Intであり、この時点でラベル情報は欠落しています。

swift

1print(type(of: multiply)) 2//=> (Int, Int) -> Int

なので、ラベルが違ってても代入できます。

swift

1func mul(a: Int, b: Int) -> Int {return a * b} 2func add(c: Int, d: Int) -> Int {return c + d} 3 4var math: (Int, Int) -> Int 5math = mul 6print(math(3, 4)) //=> 12 7math = add 8print(math(3, 4)) //=> 7

投稿2017/08/23 02:03

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

関数型の変数/定数はラベルを持てないという決まりがあります。
そのため、変数/定数に関数を代入すると、ラベルの情報が消滅します。
試しにmath(a:3,b:4)としてみてください。コンパイルエラーが発生します。

そういう決まりです。


以下は別に読まなくてもいいです。


これはおそらく、関数型を引数にとる関数を簡素に使用できるようにするためと思われます。
(関数が、関数に引数として渡されるときは定数に変換されます。)

例えばmap関数を例にとると、

swift

1func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]

引数ラベルが必要なければ

swift

1let array: [Double] = [0, 1, 2] 2let sqrtArray = array.map(sqrt)

のように簡素に書けますが、引数ラベルが必要とすれば、

swift

1// 定義をこのようにする必要がある。 2func map<T>(_ transform: (element: Element) throws -> T) rethrows -> [T]

swift

1let array: [Double] = [0, 1, 2] 2// map関数の引数にラベルを合わせる 3func sqrtT(element: Double) -> Double { return sqrt(element) } 4let sqrtArray = array.map(sqrtT)

などのように、ただそれだけのために引数ラベルを合わせた関数を定義してそれを利用する必要が出てきます。

これはあまりにも面倒でバグの温床になる可能性を大いにはらんでいます。

なので、関数型の定数/変数はラベルを持てないという決まりがあるのだと推測されます。

投稿2017/08/22 10:22

MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

prtk1206

2017/08/30 10:24

そういう決まりであるということだけではなく、なぜそうなっているかまで説明していただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問