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

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

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

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

Swift

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

Q&A

解決済

1回答

2313閲覧

swift5,@Bindingで配列(MapItem型)をListで表示したい

yasumaro

総合スコア67

Xcode

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

Swift

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

0グッド

1クリップ

投稿2020/02/07 12:48

@Bindingで得た配列(MapItem型)をListで表示したいです。
List()ですが下記のように値を入れた場合だと他のviewでインスタンスを生成すると
問題なく表示されます。

import SwiftUI struct ListView: View { let arrays = ["tanaka","sato","kato"] var body: some View { List(arrays,id:.self) { array in Text(array) } } }

しかし、このように記述するとエラーがでます。
エラー:Value of type 'NSObject' has no member 'name'
そんなの無いと。。。

どのようにMap上で検索して得たMapViewItem型のデーターをListで表示できますでしょうか・

struct ListView: View { @Binding var matchingItems:[MKMapItem] var body: some View { List(matchingItems,id:.self) { matchingItem in Text(matchingItem.name) } } }

別のview

import MapKit struct HogeView: View {  @State var matchingItems:[MKMapItem] = [MKMapItem]() var body: some View { ListView(matchingItems: self.$matchingItems) } func getMapItem(){ let search = MKLocalSearch(request: request) search.start { (response, error) in // 省略 for mapItem in response!.mapItems { self.matchingItems.append(mapItem as MKMapItem) }   } }

matchingItemsをprint文でコンソール上に表示させると(matchingItems[0])
中身は下記のように取得できています。

<MKMapItem: 0x2827f6100> { isCurrentLocation = 0; name = "XXXXXXXXXXXXXXXXXXXX"; phoneNumber = "XXXXXXXXXXXXXXXXX"; placemark = "@ <+35.00000,+136.0000>"; url = "https://www.starbucks.co.jp/"; }

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

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

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

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

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

guest

回答1

0

ベストアンサー

どうしてこのようなエラーメッセージになるのかは私には説明できませんが、
MKMapItemのnameプロパティの型は String?なので、
nameがnilでないことが確実であれば、
Text(matchingItem.name!)
のようにしてアンラップすることでエラーは消えるようです。

投稿2020/02/07 15:15

TakeOne

総合スコア6299

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

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

yasumaro

2020/02/08 01:24

ありがとうございます! おっしゃった通りアンラップしたらエラーはなくなり 配列をListに表示できました!^^ どのようにして気づかれたか教えていただければ幸いです。
TakeOne

2020/02/08 11:05 編集

MKMapItemのnameプロパティって、あったはずだよね?と思って、念のため https://developer.apple.com/documentation/mapkit/mkmapitem/1452339-name を見て確認したら、型が String? となっていたので、 これは本来アンラップが必要なのでは?と思って試しにアンラップしてみたらエラーが消えました。 エラーメッセージは、MKMapItemにnameプロパティがないと言っているのではなく、NSObjectにnameプロパティがないと言っているのでエラーメッセージがまるっきり間違っているわけではありません。おそらくViewBuilderの中の何らかの仕組みにより、matchingItem変数がMKMapItemではなくNSObjectと認識されてしまうことになったのだろうなと推測しますが、それ以上のことは私にはわかりません。ViewBuilder内で発生したエラーは、エラーの原因と全然関係なさそうなエラーメッセージが出ることがよくあるので、とりあえず先入観を捨てていろいろ試してみるしかないと思います。エラーメッセージがわかりにくすぎるというのが今のSwiftUIの課題の1つだと思います。将来は改善されていくとは思いますけど。
yasumaro

2020/02/08 11:54

>matchingItem変数がMKMapItemではなくNSObjectと認識されてしまうことになったのだろうなと推測します. なるほど、”NSObject”と表示されていたことは気になっていました。 >ViewBuilder内で発生したエラーは、エラーの原因と全然関係なさそうなエラーメッセージが出ることがよくある 確かに実感しています。丁寧かつ迅速な返答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問