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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

266閲覧

Swiftの methodName() { () in 処理 } の構文の動きについて

polar_bear

総合スコア11

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2019/05/12 10:59

編集2019/05/12 11:11

質問内容

現在Swiftのテキストで学習しており、Swiftの構文でわからない点が出てきました。
主に通信処理を行うクラスの中で出てきた構文です。

dataTaskメソッドの後に続く、 { (data:... 略) in ここに処理 } はどの様な動きになっているのでしょうか。

以下テキストで出てきたものの抜粋です。

Swift

1let task = session.dataTask(with: request) { (data:Data?,response:URLResponse?, error:Error?) in 2 3 // ここに処理 4}

構文がわからないので、うまく検索することができませんでした。
お力をお貸しいただければと思います。
よろしくお願いいたします。

バージョン

Swift5

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

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

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

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

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

guest

回答1

0

ベストアンサー

closure expressionと呼ばれる構文です。

https://docs.swift.org/swift-book/LanguageGuide/Closures.html

要するに「引数を与えて何かを計算し結果を返してくれるようなオブジェクト」のことです。これは関数そのものといえ、Swiftは関数そのものもデータとして変数へ代入したり別の関数の引数として渡したり関数から返したりといったことができます。(Swiftに限らず多くの言語でも同様のことができ、大変強力なのでこれを知っておくとプログラミングの幅が広がると思います。)


大雑把なclosureのあれこれ:

関数的なものをデータとして扱えるということは「それに型がある」ということになりますが、例えば「整数を2つ与えて整数を返すようなクロージャオブジェクト」を表す型は

(Int, Int) -> Int

と表現します。またこのクロージャーオブジェクトを引数にとる関数を定義できて

swift

1// 整数配列をop演算によって集約する 2func reduce(_ array: [Int], _ initial: Int, op: (Int, Int) -> Int) -> Int { 3 var accumulator = initial 4 for e in array { 5 accumulator = op(accumulator, e) 6 } 7 return accumulator 8} 9 10let a = [1, 3, 4] 11print(reduce(a, 0) { (a, b) in a + b }) // => 8 (加算による集約:累加) 12print(reduce(a, 1) { (a, b) in a * b }) // => 12 (乗算による集約:累積)

のように、クロージャーを用いることで「大変単純な定義であるにも関わらず多彩な計算を行える汎用性を持つ」ものにできます。

なおSwiftのclosureは色々な省略構文が工夫されており、例えば上の例を省略せずに書くと

{ (a: Int, b: Int) -> Int in return a + b }

となりますが、a, bの型やclosureの結果の型はreduceの引数が(Int, Int) -> Intであることから型推論により確定できるため省略できます。また単一の式をreturnする場合はreturnも省略できます。またclosureを最終の引数にした場合、

swift

1let result = reduce(a, 0, { (a, b) in a + b }) 2 3// と書く代わりに 4 5let result = reduce(a, 0) { (a, b) in 6 a + b 7} 8 9// とも書ける

ということで、複数行にわたり複雑な計算を行うようなクロージャーであっても括弧の入れ子が深くなりすぎず、スッキリした見栄えでコードを表現できます。

このあたりはclosure expressionに関する文法をよく学んでおくと、いろいろな書き方を目にしてもビックリせずにすむと思います。

投稿2019/05/12 13:28

KSwordOfHaste

総合スコア18394

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

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

polar_bear

2019/05/12 15:31

なるほど!Closuresと呼ばれるものなんですね。 見慣れないうちは、びっくりしてしまいますが、構文に慣れると、少ないコードで多彩な処理を行うことができる有用なものですね! 参考でいただいたリンクでも学んでみます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問