🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
iOS

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

クロージャ

クロージャは、プログラミング言語における関数オブジェクトの一種です。 引数以外の変数を実行時の環境ではなく、 自身が定義された環境において解決することを特徴とします。

Q&A

解決済

1回答

1223閲覧

クロージャの仕組みについて

aae_11

総合スコア178

iOS

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

クロージャ

クロージャは、プログラミング言語における関数オブジェクトの一種です。 引数以外の変数を実行時の環境ではなく、 自身が定義された環境において解決することを特徴とします。

0グッド

0クリップ

投稿2019/11/27 11:38

Swiftのクロージャーについて、分からない部分があった為、ご質問させて貰いました。
以下は、Mapkitを使用した地図アプリ作成途中のコードになります。

import UIKit import MapKit import CoreLocation class ViewController: UIViewController,CLLocationManagerDelegate ,UIGestureRecognizerDelegate { var addressString = "" @IBOutlet var longPress: UILongPressGestureRecognizer! @IBOutlet weak var settingButton: UIButton! @IBOutlet weak var mapView: MKMapView! var locManager:CLLocationManager @IBOutlet weak var addresslabel: UILabel! override func viewDidLoad() { super.viewDidLoad() settingButton.backgroundColor = .white settingButton.layer.cornerRadius = 20.0 } @IBAction func longPressTap(_ sender: UILongPressGestureRecognizer) { if sender.state == .began{ //タップ開始 }else if sender.state == .ended{ //タップ終了 //タップした位置を指定して、MKMapView上の緯度、経度を取得する //緯度、経度から住所に変換する let tapPoint = sender.location(in: view) //タップ位置 //(CGPoint)を指定して、MKMapView上の緯度経度を取得する let center = mapView.convert(tapPoint, toCoordinateFrom: mapView) let lat = center.latitude let log = center.longitude convert(lat: lat,log: log) } func convert(lat:CLLocationDegrees,log:CLLocationDegrees){ let geocoder = CLGeocoder() let location = CLLocation(latitude: lat, longitude: log) //クロージャー geocoder.reverseGeocodeLocation(location) { (placeMark, error) in if let placeMark = placeMark{ if let pm = placeMark.first{ if pm.administrativeArea != nil || pm.locality != nil{ self.addressString = pm.name! + pm.administrativeArea! + pm.locality! }else{ self.addressString = pm.name! } self.addresslabel.text = self.addressString } } } } } }

疑問点は主に、以下の部分です。

geocoder.reverseGeocodeLocation(location) { (placeMark, error) in if let placeMark = placeMark{ if let pm = placeMark.first{ if pm.administrativeArea != nil || pm.locality != nil{ self.addressString = pm.name! + pm.administrativeArea! + pm.locality! }else{ self.addressString = pm.name! } self.addresslabel.text = self.addressString } } }

geocorderのreverseGeocodeLocation(location)メソッドが呼ばれた際の次にクロージャの記述がありますが、reverseGeocodeLocationメソッドの引数内にクロージャが指定されている訳ではありません。
クロージャについてはQiitaの記事を読んだのですが、上記の場合、「イコール」で代入されている訳でもありません。
どのような仕組みでクロージャが実行されているか分からない為、こちらの部分につきまして、ご助言頂けましたら幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Trailing Closureといいます。
関数の最後の引数の型が関数であった場合、その関数をクロージャとして外に出すことが出来ます。

実例を見てみるのが分かりやすいと思うので。

swift

1func f(_ i: Int, g: (Int) -> Void) { 2 for j in (0..<i) { 3 g(j) 4 } 5} 6 7 8/// 普通の書き方 9f(3, g: { i in print(i) }) 10// prints ... 11// 0 12// 1 13// 2 14 15 16/// Trailing Closure 17f(3) { i in print(i) } 18// prints ... 19// 0 20// 1 21// 2

2つのfの呼び出しは全く同じことを行っています。
2つ目の呼び出しは第2引数がそのまま外に追い出されているようになっているのが分かると思います。

投稿2019/11/27 13:36

MasakiHori

総合スコア3391

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

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

aae_11

2019/11/28 01:56

ご回答ありがとうございます。 「Trailing Closure」と言うのですね。 すみません。まだいまいち理解出来ない部分があるのですが、「g: { i in print(i) }」こちらの部分の「i」はf関数内の」g(j)」こちらの部分で入ってくる「j」つまり、引数であるとの解釈であっていますでしょうか...? また、f関数内の「 g: (Int)」こちらの「int」の部分はg(j)で呼び出された際の型を表しているといった感じでしょうか...?
aae_11

2019/11/29 07:27

リンクありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問