SwiftUIのTextFieldビューでは、状態変数を引数としてバインドさせることで、入力に合わせてリアルタイムでデータの更新処理を行わせることができる。
ただ、この時バインドさせる値のデータ型がオプショナル型であった場合エラーが発生する。
例えばCoreDataのエンティティで、文字列を格納する変数をバインドさせたい場合、特に何もせず通常の流れどおりエンティティを作成するとデータがオプショナル型になってしまうので、エラーが発生してしまうのだ。
struct TaskEditView: View {
@ObservedObject var task: Task
@Environment(\.managedObjectContext) var viewContext
@Environment(\.presentationMode) var presentation
var body: some View {
VStack {
Form {
Section(header: Text("タイトル ※必須")) {
TextField("Edit TaskName", text: $task.name)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding(10)
}
...
上記は一例だが、2行目でバインドさせるためのエンティティを変数宣言し、11行目でTextFieldにバインドさせている。
この時にエラーが発生する。
この問題を解消するには、データ型を変更してあげる必要がある。
今回はその手順を紹介しよう。
非オプショナル型に変更する
CoreDataのエンティティを作成する場合、xcodeの以下の画面から作成する。
![](https://i0.wp.com/chusotsu-program.com/wp-content/uploads/2021/04/image-17.png?resize=1024%2C237&ssl=1)
その時、画面右のインスペクターパネルでエンティティの属性を細かく設定できる。
![](https://i0.wp.com/chusotsu-program.com/wp-content/uploads/2021/04/image-18.png?resize=526%2C356&ssl=1)
デフォルトでOptionalにチェックが入っているので、これをオフにすれば良いかと思うが、これだけでは問題は解消しない。
まず、対象のエンティティを選択状態にしよう。
![](https://i0.wp.com/chusotsu-program.com/wp-content/uploads/2021/04/image-20.png?resize=400%2C138&ssl=1)
次にメニューからEditor -> Create NSManagedObject Subclass…を選択する。
![](https://i0.wp.com/chusotsu-program.com/wp-content/uploads/2021/04/image-21.png?resize=644%2C666&ssl=1)
すると、画面左のファイルツリーに新たに二つのファイルが生成されるうので「エンティティ名+CoreDataProperties.swift」を選択。
![](https://i0.wp.com/chusotsu-program.com/wp-content/uploads/2021/04/image-22.png?resize=546%2C86&ssl=1)
プロパティ名とデータ型の宣言が書かれているので、オプショナル型を表す「?」を削除すればOK。
![](https://i0.wp.com/chusotsu-program.com/wp-content/uploads/2021/04/image-23.png?resize=1024%2C492&ssl=1)
これで非オプショナル型のプロパティに変更され、TextFieldにバインドできるようになる。