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

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

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

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

Q&A

解決済

1回答

734閲覧

Thread 1: signal SIGABRTのエラー

zaka

総合スコア1

Swift

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

0グッド

0クリップ

投稿2022/04/28 13:12

シミュレータで起動してみると
Thread 1: signal SIGABRT
このようなエラー分が出ます。

やりたいこと

Realmに保存したString型をresultに代入して、
次にこのresultをDate型にキャストしてdate3に代入したいです。

エラーの写真

イメージ説明
このように、as!に赤線が引かれています。

初心者で勉強不足です。申し訳ないです。
教えてください。どうかお願いします。

コード

swift

1コード 2```class DateUtils { 3 //String → Date 4 class func dateFromString(string: String, format: String) -> Date { 5 let formatter: DateFormatter = DateFormatter() 6 formatter.calendar = Calendar(identifier: .gregorian) 7 formatter.dateFormat = format 8 return formatter.date(from: string)! 9 } 10 } 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 //① Realmのインスタンス生成 16 let realm = try! Realm() 17 18 // ②dateStrだけ取得 19 let result = realm.objects(User2.self).value(forKey: "dateStr") as! String 20 //resultをdate型に変えてdate3に代入 21 let date3 : Date = DateUtils.dateFromString(string: result, format: "yyyyMMdd") 22 23 24 //現在時刻の取得 25 let date1 : Date = Date() 26 27 //date1とdate3間の差 28 let Days = (Calendar.current.dateComponents([.day], from: date1, to: date3)).day! 29 30 CountLabel.text = "\(Days + 1)" 31 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

objectsの戻りはコレクションのようです。
Stringは1つの値だけを扱う型ですので、コレクションをそのままキャストできないように見えました。
(違っていたらすみません。。)
(value(forKey:)のドキュメントを見つけられなかったのですが、多分これの戻りもコレクションかなと思っています)

https://www.mongodb.com/docs/realm/sdk/swift/quick-start/#complete-example

リンクを参考にすると次のような感じになるでしょうか。
(Xcodeで書いていませんのでビルドの時点でエラーになるかもしれません。。)

swift

1let users = realm.objects(User2.self) 2let user2 = users[0] 3let result = user2.dateStr 4// 続く

Filter Dataなども見てみると良いかもしれません。
https://www.mongodb.com/docs/realm/sdk/swift/examples/filter-data/

投稿2022/04/29 00:59

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

zaka

2022/04/29 11:31

回答して頂き本当にありがとうございます。 理解した上で書かれている通りにコードを書いてみたら、このエラー事態は消えました。 しかしまた新たなエラーが発生してしまいました。 シミュレータで起動した時にAppDelegate.swift の @mainというところに Thread 1: "Index 1 is out of bounds (must be less than 0)."というエラーが出てしまいました。 調べた結果よくわかりませんでした。 恐れ多いのですが、解決策とかありましたらよろしくお願いします。
退会済みユーザー

退会済みユーザー

2022/04/29 11:42

コメントありがとうございます。 > "Index 1 is out of bounds (must be less than 0)." どこかでインデックス[1]でアクセスしていますでしょうか? デバッグしてエラーが発生する行を特定する必要があると思います。 viewDidLoadの最初にブレイクポイントを設定しておいて、1行ずつ進めてみてください。 *インデックス1だから違うかなと思うのですが、もし`users[0]`の部分でエラーになっているようでしたら、データがないことが原因だと思います。 先にデータを登録してみてください。
zaka

2022/05/04 07:12

返信遅くなりすみません。 「先にデータを登録してみてください。」というアドバイスに従ったところ エラーが出ませんでした。 しかしtableviewにもデータを表示しているので先にデータを登録しているといらないデータがtableviewに表示されてしまいます。 先に入れたデータを隠すなど他にいい解決法はありませんでしょうか。 何度も申し訳ないです。
退会済みユーザー

退会済みユーザー

2022/05/04 07:39

コメントありがとうございます。 (こちらこそ回答が不十分ですみません。。) データがない場合はviewDidLoadが呼び出されないようにしないといけないのですかね。 > `print(coffeeDrinks.first?.name)` > https://www.mongodb.com/docs/realm/sdk/swift/xcode-playgrounds/#experiment-with-realm > `if realm.objects(Group.self).count == 0 {` > https://www.mongodb.com/docs/realm/sdk/swift/swiftui/#integrate-mongodb-realm-and-sync 次のいずれかの形で存在する場合だけ処理することができますでしょうか。 (すみません、実際に動かしていません。。) `if let user2 = users.first { }` `if 0 < users.count { }` *このビューの親に当たるビューの内容も把握しないと、適切な回答になっていないかもしれません
zaka

2022/05/09 08:24

返信遅くなりすみません。 どうやって解決できたのはわかりませんが、 2022/04/29 20:42に返信してくれた方法を何度かやってみるとできるようになりました。 本当にありがとうございます。
退会済みユーザー

退会済みユーザー

2022/05/09 10:13

コメントありがとうございます。 一つ前の私からのコメントはちょっと見当違いだったのですね。。 でも解決できたようで良かったです。 今回の問題が解消できたようでしたら、解決済みにしておくと良いと思います(自己解決の形でもOKだと思います)。 *まだ不明な点があるようでしたらコメントください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問