Ang @State ay isang Property Wrapper sa SwiftUI para sa pamamahala ng lokal na estado sa loob ng isang view. Awtomatikong iginuhit muli ng SwiftUI ang view sa bawat pagbabago ng @State property, ginagawang reaktibo ang interface nang walang manu-manong tawag sa pag-update. Ayon sa Apple Developer Documentation (2025), ang @State ay inirerekomenda para sa mga simpleng uri at istruktura na pagmamay-ari ng isang view. @State ang pinakasimpleng paraan upang magdagdag ng interaktibidad sa interface ng SwiftUI.
Mga pangunahing punto
@State ay isang built-in na Property Wrapper sa SwiftUI na nagpapahintulot sa isang view na mag-imbak at subaybayan ang sarili nitong estado. Kapag nagbago ang halaga ng @State, awtomatikong iginuhit muli ng SwiftUI ang view, muling tinatawag ang body property. Ito ang pundasyon ng reaktibong programming sa SwiftUI: idinedeklara ng developer ang estado, at ang framework ang bahala sa pag-sync ng interface.
Ang @State ay lumilikha ng storage area sa heap na pinamamahalaan ng SwiftUI. Ang area na ito ay persistent — nabubuhay ito sa paulit-ulit na pagsisimula ng istruktura ng view na nagaganap sa bawat render. Ginagamit ng SwiftUI ang identifier ng view (nabuo batay sa posisyon sa hierarchy) upang itali ang @State property sa isang partikular na view. Dahil dito, hindi nare-reset ang estado kapag na-update ang parent view.
Mahalagang limitasyon: ang @State ay para lamang sa mga value type (mga istruktura, enumeration, primitive). Para sa mga reference type (klase) gamitin ang @StateObject o @ObservedObject. Kung magtalaga ka ng klase sa @State property, hindi matutukoy ng SwiftUI ang mga pagbabago sa loob ng object — tanging ang pagpapalit ng buong reference.
Ipinapatupad ng SwiftUI ang @State sa pamamagitan ng internal na mekanismo ng Storage. Ang bawat @State property ay tumatanggap ng dedikadong memory cell na nakaimbak sa espesyal na storage container ng view. Kapag naganap ang pagsulat sa wrappedValue, sa pamamagitan ng didSet ay inaabisuhan ng SwiftUI ang dependency graph nito tungkol sa pangangailangan ng pag-redrawing.
struct ContentView: View {
@State private var name: String = "User"
@State private var isLoggedIn: Bool = false
var body: some View {
VStack {
Text("Kumusta, \(name)")
Button(isLoggedIn ? "Mag-log out" : "Mag-log in") {
isLoggedIn.toggle()
}
}
}
}
Sa halimbawa mayroong dalawang @State property: name (String) at isLoggedIn (Bool). Kapag tinawag ang isLoggedIn.toggle(), minamarkahan ng SwiftUI ang ContentView bilang nangangailangan ng pag-update at muling pinapatakbo ang body sa susunod na cycle ng render. Pangunahing punto: ang @State property ay laging idineklara gamit ang private modifier — ito ay senyales na ang estado ay eksklusibong pagmamay-ari ng kasalukuyang view at hindi dapat baguhin mula sa labas nang direkta.
Para sa pagmamasid sa mga pagbabago, gumagamit ang SwiftUI ng CurrentValueSubject mula sa Combine. Bawat @State property ay lumilikha ng nakatagong publisher na nag-aabiso sa sistema sa bawat pagbabago. Ito ay nagpapahintulot sa SwiftUI na iguhit muli lamang ang minimum na kinakailangang set ng mga view, iniiwasan ang buong pag-update ng hierarchy.
Ang @State ay optimal para sa mga simpleng lokal na estado: mga text field para sa paghahanap, boolean flag para sa modal window, switch ng setting, counter, napiling elemento ng listahan. Kung ang halaga ay ginagamit lamang sa isang view at sa mga nested component nito (sa pamamagitan ng @Binding), ang @State ang tamang pagpili. Para sa mga estado na dapat mabuhay pagkatapos isara ang view (hal. data ng form), ang @State ay angkop din hangga't ang view ay nananatili sa hierarchy.
Huwag gamitin ang @State para sa mga global na estado ng application, pag-cache ng data ng network o mga bagay na ginagamit sa maraming screen. Para sa mga layuning ito ay ang @StateObject at @EnvironmentObject. Hindi rin angkop ang @State para sa pag-imbak ng malaking halaga ng data — sa bawat pagbabago, ang buong view ay iguguhit muli.
Ang @Binding ay tulay sa pagitan ng @State sa parent view at ng child view na kailangang baguhin ang estadong ito. Idinedeklara ng parent ang @State, at ang child component ay tumatanggap ng Binding sa pamamagitan ng $ projection. Ang pagbabago ng Binding sa child view ay awtomatikong nag-a-update ng @State sa parent — at vice versa. Tinitiyak nito ang one-way na daloy ng data na may posibilidad ng feedback.
struct ParentView: View {
@State private var text: String = ""
var body: some View {
ChildView(text: $text)
}
}
struct ChildView: View {
@Binding var text: String
var body: some View {
TextField("Enter text", text: $text)
}
}
Sa listing, ang ParentView ang may-ari ng @State text, at ang ChildView ay tumatanggap ng $text bilang Binding. Ang TextField sa loob ng ChildView ay nakatali sa Binding na ito sa pamamagitan ng text: $text. Kapag nag-type ang user sa TextField, nagbabago ang halaga sa ChildView sa pamamagitan ng Binding, na nagiging sanhi ng pag-update ng @State sa ParentView. Ang parehong view ay iginuhit muli na may bagong halaga.
Ang pinakakaraniwang pagkakamali — pagtatalaga ng klase sa @State property. Kung isulat mo ang @State var model = MyClass(), hindi matutunton ng SwiftUI ang mga pagbabago ng property sa loob ng klase — tanging ang pagpapalit ng mismong object. Para sa mga klase laging gamitin ang @StateObject. Ang pangalawang karaniwang problema — pagdedeklara ng @State nang walang private modifier, na lumalabag sa prinsipyo ng encapsulation ng estado.
Direktang pagpasa ng @State sa child view nang walang $ — isa pang karaniwang pagkakamali. Kung ipasa mo ang TextField(text: text) sa halip na TextField(text: $text), ang child component ay makakatanggap ng simpleng string, hindi Binding. Ang pagbabago ng text sa TextField ay hindi isi-sync sa parent @State. Laging gamitin ang $ projection para magpasa ng Binding.
Ang pangatlong pagkakamali — maramihang @State property para sa magkakaugnay na data. Kung ang ilang halaga ay lohikal na bumubuo ng isang kabuuan (hal. mga field ng form), pagsamahin ang mga ito sa isang istruktura na may iisang @State. Pinapasimple nito ang pagpasa ng estado sa mga child view at binabawasan ang bilang ng mga hiwalay na trigger ng pag-update.
Ang @State ay ginagamit sa karamihan ng mga proyekto ng SwiftUI para sa pangunahing interaktibidad. Tingnan natin ang halimbawa ng login form, kung saan pinamamahalaan ng @State ang mga text field at loading state. Ang pattern na ito ay matatagpuan sa bawat application — mula sa simpleng notes hanggang sa kumplikadong corporate solutions.
struct LoginView: View {
@State private var email: String = ""
@State private var password: String = ""
@State private var isLoading: Bool = false
@State private var errorMessage: String?
var body: some View {
Form {
TextField("Email", text: $email)
SecureField("Password", text: $password)
Button("Mag-log in") {
login()
}.disabled(isLoading)
}
}
private func login() {
isLoading = true
// Magsagawa ng network request
}
}
Sa halimbawa mayroong apat na @State property: email at password para sa mga field ng form, isLoading para sa indikasyon ng pag-load at errorMessage para sa pagpapakita ng mga error. Ang bawat property ay malayang namamahala sa sarili nitong bahagi ng interface. Kapag nagbago ang isLoading, ang button ay awtomatikong na-block sa pamamagitan ng disabled(isLoading) — nang walang manu-manong pag-update ng UI.
Mga madalas itanong
Ang @State ay dinisenyo para sa lokal na estado ng isang partikular na view. Tinitiyak ng private modifier na hindi ito direktang mababago ng ibang component, na lumalabag sa encapsulation. Para sa panlabas na access gamitin ang $ projection.
Oo, sinusuportahan ng @State ang mga array at diksyunaryo, dahil ito ay mga value type. Gayunpaman, kapag nagbago ang elemento ng array, iginuhit muli ng SwiftUI ang buong view. Para sa malalaking listahan, mas epektibo ang paggamit ng @StateObject na may @Published.
Ang @State ay gumagana nang tama sa mga Optional type. Kapag nagtalaga ng nil, natutukoy ng SwiftUI ang pagbabago at iginuhit muli ang view. Ito ay maginhawa para sa mga estado tulad ng errorMessage: String?, kung saan ang nil ay nangangahulugang walang error.
Ang @State ay nagpapanatili ng halaga hangga't ang view ay nananatili sa hierarchy. Kung ang view ay tinanggal mula sa hierarchy at idinagdag muli, ang @State ay magsisimulang muli na may default na halaga. Para sa persistence gamitin ang @AppStorage.
Oo, balutin ang pagbabago sa withAnimation: withAnimation(.easeInOut) { isExpanded.toggle() }. Ina-animate ng SwiftUI ang transition sa pagitan ng luma at bagong estado ng interface na may tinukoy na uri ng animation.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din