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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

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

Swift

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

Q&A

解決済

2回答

3465閲覧

SwiftエラーType '' has no subscript membersを解決して、Dictionaryを現在地からの近さ順に並べたい

rhcp56

総合スコア8

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/08/28 04:42

編集2018/09/01 09:59

前提・実現したいこと

Swiftでグルメアプリを製作中なのですが、エラーがなかなか解決できずかなりつまづいています。解決法やアドバイスなど頂けると幸いです。

やりたいこと
FirebaseのFirestoreから取得したデータを元に、CoreLocationを用いて現在地から近い順にデータを並べ替え、TableViewに表示したい。

今やろうとしていることは、CoreLocationを用いて現在地と店舗との距離を測定し、keyをDistanceとしてデータに追加しようとしています。しかし下記のエラーが出てしまい、うまくいきません。

まずこの方法で現在地から近い順にソートできるかも自身もないため、そのほかにもやり方などあれば教えていただきたいです。

発生している問題・エラーメッセージ

Type 'Shop' has no subscript members

該当のソースコード

shopArrayにShop型のデータが突っ込んであります。

Swift

1 func locationManager(_ manager: CLLocationManager, didUpdateLOcations locations: [CLLocation]){ 2 let localValue:CLLocationCoordinate2D = manager.location!.coordinate 3 print("locations =(localValue.latitude) (localValue.longitude)") 4 5 for i in 0 ..< self.shopArray.count{ 6 let currentLocation : CLLocation = CLLocation(latitude: localValue.latitude, longitude: localValue.longitude) 7 let shopLocation : CLLocation = CLLocation(latitude: self.shopArray[i].latitude, longitude: self.shopArray[i].longitude) 8 let distance = shopLocation.distance(from: currentLocation) 9 shopArray[i]["distance"] = "distance"#エラーはこの行に出ます。 10 11データの形式は下記です。 12struct Shop { 13 var title: String 14 var recomendation: String 15 var tel: String 16 var station: String 17 var latitude: Double 18 var longitude: Double 19 var price: Int 20 var img: String 21 var distance: CLLocationDistance? 22 23 24 25 26 } 27追記  28 29様々な回答を参考に修正したのですが、distancenilになってしまいます。shopArrayにデータを格納するコードの方を追記致しましたので、どの点に間違いがあるかご教授くださると幸いです。 30 31 32shopArrayにデータを格納するコード 33 34 func loadData() { 35 let db = Firestore.firestore() 36 let shopsRef = db.collection("shops") 37 38 shopsRef.getDocuments() { (snapshot, err) in 39 if let err = err { 40 print("Error getting documents: (err)") 41 } else { 42 if let snapshot = snapshot{ 43 for document in snapshot.documents { 44 45 print(document.data()) 46 let data = document.data() 47 let title = data["title"] as? String ?? "" 48 let recomendation = data["recomendation"] as? String ?? "" 49 let tel = data["tel"] as? String ?? "" 50 let station = data["station"] as? String ?? "" 51 let latitude = data["latitude"] as? Double ?? Double() 52 let longitude = data["longitude"] as? Double ?? Double() 53 let price = data["price"] as? Int ?? Int() 54 let img = data["img"] as? String ?? "" 55 let distance = data["distance"] as? CLLocationDistance ?? Double() 56 57 let newShop = Shop(title: title, recomendation: recomendation, tel: tel, station: station, latitude: latitude, longitude: longitude, price: price, img: img, distance: distance) 58 self.shopArray.append(newShop) 59 60 func locationManager(_ manager: CLLocationManager, didUpdateLOcations locations: [CLLocation]){ 61 guard let currentLocation = manager.location else { 62 print("location is nil") 63 return 64 } 65 print("locations =(currentLocation.coordinate)") 66 67 68 for i in self.shopArray.indices{ 69 // let currentLocation : CLLocation = CLLocation(latitude: localValue.latitude, longitude: localValue.longitude) 70 let shopLocation : CLLocation = CLLocation(latitude: self.shopArray[i].latitude, longitude: self.shopArray[i].longitude) 71 let distance = shopLocation.distance(from: currentLocation) 72 self.shopArray[i].distance = distance //<- 73 74 } 75 self.shopArray.sort{$0.distance ?? 0.0 < $1.distance ?? 0.0} 76 self.cafeTableView.reloadData() 77 } 78 79 80 } 81 82 83 } 84 85 } 86 87 88 89 } 90 }

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

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

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

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

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

guest

回答2

0

https://stackoverflow.com/questions/35199363/sort-array-by-calculated-distance-in-swift

Shopの代わりに、class Placeとしていますが、上記にソートのやり方も含めて記載されております。(コメントの方までご覧ください)

投稿2018/08/28 08:39

t_obara

総合スコア5488

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

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

rhcp56

2018/09/01 09:47

ご回答ありがとうございます! 様々なご意見を参考にして修正したのですが、distanceがnilになってしまいます。追記にデータを格納するコードを追記致しましたので、どの点に問題があるかご教授いただけると幸いです。
guest

0

ベストアンサー

shopArray[i]["distance"]はDictionary(辞書)の書き方です。

swift

1//distanceを追加しておいて 2struct Shop { 3 : 4 var distance: CLLocationDistance 5} 6 7//値を代入 8shopArray[i].distance = shopLocation.distance(from: currentLocation)

でどうでしょう?

投稿2018/08/28 05:31

fuzzball

総合スコア16731

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

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

rhcp56

2018/09/01 09:47

ご回答ありがとうございます! 様々なご意見を参考にして修正したのですが、distanceがnilになってしまいます。追記にデータを格納するコードを追記致しましたので、どの点に問題があるかご教授いただけると幸いです。
fuzzball

2018/09/03 00:02

nilになるときの shopLocation とcurrentLocation を書いて下さい。 あと、 let distance = data["distance"] as? CLLocationDistance ?? Double() これは不要では?データに"distance"は含まれてないですよね? (このdistanceは後で使われていないので今回の件とは関係ないですが)
rhcp56

2018/09/06 11:54

ご回答ありがとうございます。 無事解決いたしました!ご協力感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問