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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Core Data

Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

Xcode

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

Swift

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

Q&A

解決済

1回答

3277閲覧

[Xcode/SwiftUI] CoreDataに配列を登録したい、配列を取り出して使いたいです。

SwiftBeginner

総合スコア9

Core Data

Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2022/08/22 10:30

編集2022/08/22 10:35

前提

CoreDataのAttributeに配列を登録しようとしています。
登録するところまではできているようですが、登録した配列をどうやって使うのかが分かりません。

実現したいこと

イメージ説明

上のスクリーンショットの通り、ItemというEntityのなかのwordArrayというAttributeに、Stringの配列を登録したいと考えています。そして、その配列を取り出して使えるようにしたいです。

試したこと

先程のスクリーンショットの通り、wordArrayのTypeをTransformableに設定し、TransformerをNSSecureUnarchiveFromDataTransformerNameとしました。
これは、
https://qiita.com/gonsee/items/a61792aa04ba53b7fa1a
に記載されていた通りに行ったことです。

Swift

1private func addItem(_ array: [String]) { 2 let newitem = Item(context: context) 3 newitem.wordArray = array as NSObject 4 newitem.index = Int16(items.count + 1) 5 6 7 do { 8 try context.save() 9 } catch { 10 let nsError = error as NSError 11 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") 12 } 13 14 } 15

以上のようにaddItemを設定し、addItem([String])で言葉の配列をCoreDataに登録できるようにしました。 "as NSObject"は、これを付けるように警告が出たため、fixを押して付け加えられたものです。
試しに[apple, banana]という配列と[red, blue, yellow]という配列を登録しました。

Swift

1struct ContentView: View { 2 @Environment(\.managedObjectContext) private var context 3 @FetchRequest( 4 sortDescriptors: [NSSortDescriptor(keyPath: \Item.index, ascending: true)], 5 animation: .default) 6 private var items: FetchedResults<Item> 7 var body: some View { 8 HStack{ 9 VStack{ 10 Button("表示"){ 11 print(items) 12 }

このようにCoreDataの中身を取得し、ボタンを押して中身をprintさせたところ、

data: {
index = 1;
wordArray = "(\n apple,\n banana\n)";
}
data: {
index = 2;
wordArray = "(\n red,\n yellow,\n blue\n)";
}

と表示され、やはり配列の登録はできているようです。

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

ボタンを押すと最初のデータのwordArrayの要素数をprintできるように

Swift

1Button("表示"){ 2 print(items[0].wordArray.count) 3}

と設定したところ、

Cannot convert value of type 'Int' to expected argument type 'Range<FetchedResults<Item>.Index>' (aka 'Range<Int>')

Value of type 'Slice<FetchedResults<Item>>' has no member 'wordArray'

というエラーメッセージが表示されました。
要素数以外にも、配列の最初の言葉を取得するためにitems[0].wordArray[0]をプリントしようとしても同様のエラーが表示されました。

items[0].wordArrayを通常の配列として扱えていないということでしょうか。
items[0].wordArrayの型をプリントさせたところ、Optional<NSObject>と表示されました。これを[String]に変換できれば良いのかなと考えていますが、その方法が分からずどうにもならなくなり質問させていただきました。

アドバイスよろしくお願いいたします。

・以上の通り配列の登録はできていますが、この登録方法にこだわりはありません。配列を登録し、それを使うことができればどのような方法でも良いので教えていただければ嬉しいです。
・「〇〇で検索すると良いかもしれない」などの情報もいただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

1つ目のエラーは再現できなかったのですが、
次のような感じにしてみたらいかがでしょうか。

swift

1print((items[0].wordArray as? [String])?.count ?? -1)

次のリンクあたりが参考になるかもしれません。

Bridging Between Array and NSArray
https://developer.apple.com/documentation/swift/array

Arrays
https://docs.swift.org/swift-book/LanguageGuide/CollectionTypes.html#ID107

Type Casting
https://docs.swift.org/swift-book/LanguageGuide/TypeCasting.html

投稿2022/08/22 14:02

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

SwiftBeginner

2022/08/22 14:39

ありがとうございます!無事にprintできました!リンクも送っていただき、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問