#はじめに
SwiftUIを学ぶうちに@State
と@Binding
という@がつくソースコードに出会いました!
今回はswiftでは見慣れない、この@State
と@Binding
について、着目していきたいと思います。
#@State
###特徴
・構造体のプロパティ(変数)の値を変更できるようになります。
・@State
がついた変数は値が変化すると、自動でViewが更新されます。
import SwiftUI
struct ContentView: View {
@State var tapState = "ボタンをタップしてね"
var body: some View {
VStack{
Text(tapState)
Button(action:{
//ボタンが押されたときに実行
tapState = "タップされました!"
}){
Text("ボタン")
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F651213%2F9688ea7e-7922-8a7b-06d8-053e14f3f29d.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=debedc639ae19aba467b19158b00b26f)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F651213%2F88ad1128-0c7d-c827-eb62-ce98e44e5110.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a5b2cd44047f5812b806671f09dbddd9)
これはボタンがタップされたときにtapState変数の値が書き換わり
それによりViewが更新されるためボタンの上の文字が変化します。
#@Binding
import SwiftUI
struct ContentView: View {
@State var isChecked_content : Bool = false
var body: some View {
HStack{
Text(isChecked_content ? "チェックされたよ": "チェックしてね!").padding(.trailing,10)
CheckView(isChecked: $isChecked_content)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
import SwiftUI
struct CheckView: View {
@Binding var isChecked :Bool
var body: some View {
Button(action:{
isChecked.toggle()
}){
Image(systemName: isChecked ? "checkmark.circle" : "circle")
.foregroundColor(isChecked ? .blue :.gray)
}
.scaleEffect(CGSize(width: 2.0, height: 2.0))
.frame(width: 40, height: 40, alignment: .center)
}
}
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F651213%2Fa066cb68-c69d-83a8-e78b-ef64881d2b7a.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=731697f80031108142af9bcfca130761)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F651213%2F8a84458f-99de-1312-b62a-568c0b633524.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=2b9d803662a6ea18f1c1d8d036583dd9)
チェックマークをタップすると画像がチェックマークに変わり
文言も「チェックされたよ」に変化しました。
これは@Binging
を使用することでisChecked_contentの変数をCeckViewのisChecked変数に
バインディング(紐付けること)ができたためです。
バインディングされたことによりCheckView側で変更されたisCheckedの値が
isChecked_contentにも反映されているため文言が変化しています。
注意としてはCheckViewにisChecked_contentを渡す際に
変数の頭に$をつける状態で渡します。
また、上記コードの補足として
チェクマーク表示にはSF Symbolを使用しております。