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

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

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

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

Q&A

解決済

2回答

513閲覧

SwiftのArray, forEachについて

perpouh

総合スコア299

Swift

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

0グッド

0クリップ

投稿2018/11/24 06:45

編集2018/11/27 14:27

Swift初心者です。
現在Swift4でアプリ開発を行っています。

HealthKitから取り出したデータをUITableViewに表示したいのですが、コールバック内でFatal error: NSArray element failed to match the Swift Array Element typeと言われて落ちてしまいます。

ソースコード

swift

1getTodaysDistance(completion: {datas in 2 print(type(of:datas)) 3 // Array<HKWorkout> 4 datas.forEach{ data in // ここで落ちる 5 self.dataList.append(DailyWorkoutRecord(date:data.startDate, distance:(data.totalDistance?.doubleValue(for: HKUnit.meter()))!)) 6 } 7})

ソース内にコメントで書いたとおり、printの時点での型はArray<HKWorkout>になっています。
エラー文言は「NSArray型とSwift Array Element型はちゃうねんで」というような意味だと思うのですが、どこでNSArray型が登場しているのかがまったくわかりません。
よろしければご教示をお願いします。

イメージ説明

【追記】

swift

1 func getTodaysDistance(completion: @escaping ([HKWorkout]) -> Void) { 2 let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .distanceWalkingRunning)! 3 let now = Date() 4 let startOfDay = NSDate(timeInterval: -60*60*24*30, since: now) 5 let predicate = HKQuery.predicateForSamples(withStart: startOfDay as Date, end: now, options: .strictStartDate) 6 let sort = [NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: true)] 7 let query = HKSampleQuery(sampleType: stepsQuantityType, predicate: predicate, limit: 0, sortDescriptors: sort, resultsHandler:{ 8 (query, result, error) in 9 10 if let e = error { 11 print("Error: (e.localizedDescription)") 12 return 13 } 14 DispatchQueue.main.async { 15 guard let r = result else { 16 return 17 } 18 19 let workouts = r as! [HKWorkout] 20 print(type(of:workouts)) 21 completion(workouts) 22 } 23 }) 24 25 healthStore.execute(query) 26 }

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

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

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

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

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

fuzzball

2018/11/26 00:38

appendをコメントアウトして、代わりにprint(data)にしても同じエラーになりますか?
perpouh

2018/11/26 01:12

printだめでした。そもそもforEachの中に入っていけていないようです。
fuzzball

2018/11/26 01:35

getTodaysDistance()のコードを書いて下さい。
perpouh

2018/11/27 14:27

遅くなってしまってすみません、追記しました。
guest

回答2

0

ベストアンサー

HealthKit触ったことないのですが、見た感じ怪しいのは

HKSampleQuery(sampleType: stepsQuantityType, predicate: predicate, limit: 0, sortDescriptors: sort, resultsHandler:{

(query, result, error)

でresultの型は公式マニュアルを見る限り[HKSample]?かと思います。

これを(アンラップしたあと)as! [HKWorkout]で派生クラスの配列にキャストしているのがちょっと怖いなと思いました。
(本来問題があればここでダウンキャストエラーとか出るのでしょうけど)

[HKSample]型の各要素の派生クラスの型が何になっているのか調べてみてはいかがでしょうか?
(もしくは要素を個別にas?で安全にダウンキャストしてみるなど)

投稿2018/12/04 02:08

takabosoft

総合スコア8356

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

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

perpouh

2018/12/22 09:59

お返事遅くなってしまってすみません、試したところ確かにそのキャストでコケていました。 年末年始忙しくて解決までやれそうにないので途中報告の形になってしまい、大変申し訳無いです。 ありがとうございました、取っ掛かりができたのでここからしばらく調べてみます。
guest

0

NSが頭につく奴はObjectiv-Cのクラスですね 
as! [HKWorkout]お尻につけたらキャストできたりしませんか?

投稿2018/11/24 14:17

harumi

総合スコア407

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

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

perpouh

2018/11/26 01:12

だめでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問