Bindingにoptional変数をアンラップして渡す方法を解説します。
環境
この記事の情報は次のバージョンで動作確認しています。
【Xcode】12.4
【Swift】5.3.2
【iOS】14.4
【macOS】Big Sur バージョン 11.1
【Swift】5.3.2
【iOS】14.4
【macOS】Big Sur バージョン 11.1
背景
Core Dataでエンティティの属性情報をTextFieldに渡そうとした所、次のエラーメッセージが出ました。
1 2 3 |
Cannot convert value of type 'Binding<String?>' to expected argument type 'Binding<String>' |
Core DataでString型の属性はoptionalで定義される為、TextField側で期待する'Binding<String>'型にするは、アンラップして渡す必要があります。
この時のアンラップ方法がちょっと特殊でしたので、記録に残しておきます。
エラーの再現
同様のエラーが起きる状況をシンプルなコードで再現しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import SwiftUI struct ContentView: View { @State private var name: String? = "" // nameはオプショナル型 var body: some View { VStack { TextField("", text: $name) // Cannot convert value of type 'Binding<String?>' to expected argument type 'Binding<String>' .textFieldStyle(RoundedBorderTextFieldStyle()) .padding() Text("こんにちは、\(name!)さん") } } } |
エラーが発生する行を次のようにアンラップしてみても、今度は別のエラーが出ます。
1 2 3 |
TextField("", text: $name!) // Cannot force unwrap value of non-optional type 'Binding<String?>' |
対応方法
アンラップの記述を次のようにしてやると、エラー無く動作します。
1 2 3 |
TextField("", text: Binding($name)!) |
あくまで強制アンラップなので、実装の際には事前に値がnilで無いのを確認する処理を入れて下さい。
合わせて読みたい記事
(アーカイブ)【SwiftUI】TextFieldの使い方
(2020/09/26 更新) 本記事で使用しているTextFieldの使い方はiOS14以前の仕様を元に解説しています。 最新の情報はこちらの記事を御覧ください。 テキスト入力に使うTextField()の使い方を解説します。
【SwiftUI】Core Dataの使い方:エンティエィ(Entity)を定義する
(2021/04/26 更新) Xcodeでエンティティを定義する方法を解説します。
【Swift】if let とは?
Swiftのコードでよく見かける if let 構文について解説します。