前提・実現したいこと
現在、因数分解を解くというゲーム感覚のアプリを製作しており、その上でタイムアタック記録(〇〇秒)のランキングを表示させたいと考えております。
そこで、ニフクラ(mBaaS)のデータストアにサンプルデータを格納し(下図参照)、
bestrecordというkeyの値を取得し出力しようと
print(res[0].value(forKey: "besetrecord"))
として実行したのですが、下記のようなエラーメッセージが出てしまいました。
該当のrankingViewController.swiftの全文コードを記載します。
どのように書き換えれば、欲しいkeyのデータ(bestrecordやusername)のみが取得できるでしょうか。
基礎的な知識も抜けている状態ですが、2時間以上調べても解決できなかったので、質問させていただきました。
どうかよろしくお願いします。
発生している問題・エラーメッセージ
bestrecordを出力 2020-03-17 10:31:37.240012+0900 insuubunkai[3753:210678] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NCMBObject 0x600001133110> valueForUndefinedKey:]: this class is not key value coding-compliant for the key besetrecord.' *** First throw call stack:
該当のソースコード
import UIKit import NCMB class RankingViewController: UIViewController { @IBOutlet weak var testLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() //難易度がNORMALであるオブジェクトを検索するクエリの作成 let query1 = NCMBQuery.init(className: "record")! query1.whereKey("level", equalTo: "NORMAL") //難易度がHARDであるオブジェクトを検索するクエリの作成 let query2 = NCMBQuery.init(className: "record")! query2.whereKey("level", equalTo: "HARD") // 昇順 query1.order (byAscending: "bestrecord") query2.order (byAscending: "bestrecord") //取得件数の指定 query1.limit = 5; query2.limit = 5; //検索の実行 query1.findObjectsInBackground({(results, error) in if error != nil { print("error", error ?? "") } else { //print("OK" , results as! [NCMBObject]) var res = results as! [NCMBObject] print("bestrecordを出力") print(res[0].value(forKey: "besetrecord")) //print(res[0])←これは出力に成功する } }) // do { // for obj in // try query1.findObjects() { // //print("for in 分にの出力", obj) // obj.objectforkey // } // } catch { // //エラー時の処理 // print("エラー発生") // } //検索の実行 query2.findObjectsInBackground({(results, error) in if error != nil { print("error", error ?? "") } else { print("OK" , results as! [NCMBObject]) } }) } @IBAction func tofirstAction(_ sender: UIButton) { performSegue(withIdentifier: "fromRankingtoFirst", sender: nil) } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ }
試したこと
コメント部分にも記載しておりますが、エラーが出ている部分をprint(res[0])とした時は実行は成功しました。
そのさいのデバッグ部分です。
res[0]を出力
{
"bestrecord" : 25,
"updateDate" : {
"__type" : "Date",
"iso" : "2020-03-16T07:01:05.804Z"
},
"level" : "NORMAL",
"acl" : {
"*" : {
"write" : true,
"read" : true
}
},
"username" : "yamaji01",
"objectId" : "mH1oGHABJdTmvTyj",
"createDate" : {
"__type" : "Date",
"iso" : "2020-03-16T07:01:05.803Z"
}
}
補足情報(FW/ツールのバージョンなど)
Xcode Ver.10.3
Swift Ver.5.0.1
ニフクラ無料プラン https://pfs.nifcloud.com/
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。