検索窓(TextField)、マップを表示するView(MapKit)を設置する
キーワードから緯度経度を検索 -> 緯度経度からピンの画面パーツ生成 -> ピンの画面パーツを地図画面に貼り付け
MapKitにはUIViewRepresentableを使用する
TextFieldでの文字入力と入力完了後(onCommit)の使い方を学ぶ
ContentView.swiftとMapView.swiftを作成する
SwiftUIのMapView.swiftを作成
アプリでMapを表示するにはMapKitをインポートする
MapKitは地図、衛星画像、ピン配置、住所から座標検索ができる
import SwiftUI
import MapKit
struct MapView: UIViewRepresentable {
func makeUIView(context: Context) -> MKMapView {
MKMapView()
}
func updateUIView(_ uiView: MKMapView, context: Context){
}
}
struct MapView_Previews: PreviewProvider {
static var previews: some View {
MapView()
}
}

UIViewRepresentableを記載すると、makeUIView(viewの作成)とupdateUIView(viewの変更、再描画)が必要になる
UIViewRepresentableは、MKMapViewを使うためのラッパー
### 検索キーワードの設定
MapView.swift
struct MapView: UIViewRepresentable {
let searchKey: String
func makeUIView(context: Context) -> MKMapView {
MKMapView()
}
func updateUIView(_ uiView: MKMapView, context: Context){
print(searchKey)
}
}
struct MapView_Previews: PreviewProvider {
static var previews: some View {
MapView(searchKey: "東京タワー")
}
}
ContentView.swift
struct ContentView: View {
var body: some View {
VStack {
MapView(searchKey: "東京タワー")
}
}
}
-> シュミレーターを立ち上げると”東京タワー”と表示される

シミュレータでプログラムが実行される順番
MyMapApp.swift -> ContentView.swift -> MapView.swift
### 検索キーワードから緯度経度を検索
func updateUIView(_ uiView: MKMapView, context: Context){
print(searchKey)
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(
searchKey ,
completionHandler: { (placemarks, error) in
if let unwrapPlacemarks = placemarks,
let firstPlacemark = unwrapPlacemarks.first ,
let location = firstPlacemark.location {
let targetCoordinate = location.coordinate
print(targetCoordinate)
}
})
}
追加
let pin = MKPointAnnotation()
pin.coordinate = targetCoordinate
pin.title = searchKey
uiView.region = MKCoordinateRegion(
center: targetCoordinate,
latitudinalMeters: 500.0,
longitudinalMeters: 500.0)
MKPointAnnotationはピンを置くための機能

地図の扱いは特殊ですね