SwiftUI์˜ @State

Juneยท2023๋…„ 2์›” 2์ผ
1

SwiftUI-Data

๋ชฉ๋ก ๋ณด๊ธฐ
1/12
post-thumbnail

๐Ÿ’ก ์ผ๋ฐ˜์ ์œผ๋กœ struct ๋‚ด์˜ ๋ณ€์ˆ˜๊ฐ’ ๋ณ€๊ฒฝ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.๊ตฌ์กฐ์ฒด ๋‚ด์˜ ๋ณ€์ˆ˜๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•, View๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๋™์•ˆ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ญ๊ฐ€ ์žˆ์„๊นŒ?

'@' ์ด๊ฑด ๋ญ˜๊นŒ?

์ ‘๋‘์‚ฌ๋กœ ์‚ฌ์šฉ๋˜๋Š” '@'๋Š” ์†์„ฑ๋ž˜ํผ(property wrapper)์ด๋‹ค.
์†์„ฑ ๋ž˜ํผ๋Š” ์†์„ฑ์˜ ํ™•์žฅ์ž์™€ ๋น„์Šทํ•˜๋‹ค. ์ด๋Ÿฐ ์†์„ฑ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•ด ์†์„ฑ์— ๊ธฐ๋Šฅ ๋ฐ ๋…ผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

@State

  • ๊ตฌ์กฐ์ฒด ๋‚ด ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  • View๊ฐ€ ๋‹ค์‹œ ๊ทธ๋ ค์งˆ ๋•Œ ๊ฐ’ ๊ณ„์† ํ‘œ์‹œ

@State์˜ ๊ธฐ๋ณธ - ๋‹จ๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ(์ฝ๊ธฐ์ „์šฉ ๋ฐ”์ธ๋”ฉ)

@State private var userName: String = "apple"

Text("์•„์ด๋””: \(apple)")

์ˆœ์„œ

  1. ์–ด๋–ค ๋™์ž‘์œผ๋กœ ์ธํ•ด state ๋ณ€์ˆ˜ ์—…๋ฐ์ดํŠธ
  2. state ๋ณ€์ˆ˜๊ฐ’ ์—…๋ฐ์ดํŠธ ์™„๋ฃŒ
  3. View ์ƒˆ๋กœ ๊ทธ๋ ค์ง
  4. ์ƒˆ๋กœ์šด state ๋ณ€์ˆ˜๊ฐ’ ์ฝ์Œ

'$' ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•œ ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ

@State private var password: String = "๋น„๋ฐ€๋ฒˆํ˜ธ"

TextField("๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”", text: $password)

์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์—๋Š” '$'ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.
์‚ฌ์šฉ์ž๊ฐ€ ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ ๊ฐ’์€ @State ๋ณ€์ˆ˜์— ์ €์žฅ๋˜๊ณ , ๊ด€๋ จ๋œ View๋Š” ๋‹ค์‹œ ๊ทธ๋ ค์ง„๋‹ค.

๋ฐ์ดํ„ฐ๊ฐ€ ์ฃผ๋„ํ•˜๋Š” UI

  • ๋ฐ์ดํ„ฐ๊ฐ€ UI๋ฅผ ๊ฒฐ์ •
  • UI์ปจํŠธ๋กค์„ ์ง์ ‘ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์Œ
  • UI์ปจํŠธ๋กค์ด ์—ฐ๊ฒฐ๋˜๊ฑฐ๋‚˜, ๋ฐ”์ธ๋”ฉ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐ

Single Source of Truth

๐Ÿ’ก ์ •๋ณด ์‹œ์Šคํ…œ์˜ ๋””์ž์ธ ์ด๋ก  ์ค‘ ํ•˜๋‚˜์ธ, ๋ชจ๋ธ๊ณผ ๊ทธ์™€ ์—ฐ๊ฒฐ๋œ ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•จ์— ์žˆ์–ด์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์š”์†Œ๋Š” ์‹œ์Šคํ…œ์—์„œ ์œ ์ผํ•œ ๊ฐ’์œผ๋กœ ์กด์žฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. - ์œ„ํ‚คํ”ผ๋””์•„

  • ์ฆ‰ UI์ปจํŠธ๋กค์„ ๋‘˜ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ์— ๋ฐ”์ธ๋”ฉ ํ•  ์ˆ˜ ์—†๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด ์šฐ๋ฆฌ ๊ฐ€์กฑ์ด ํ‚ค์šฐ๋Š” ๊ฐ•์•„์ง€๊ฐ€ ํ•œ ๋งˆ๋ฆฌ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ๋‚˜๋Š” ๊ฐ•์•„์ง€์—๊ฒŒ "์•‰์•„!"๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ๋™์ƒ์€ ๊ฐ•์•„์ง€์—๊ฒŒ "๋ˆ„์›Œ!"๋ผ๊ณ  ๋งํ•œ๋‹ค๋ฉด, ๊ฐ•์•„์ง€๋Š” ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์„œ ๋ˆ„๊ตฌ์˜ ๋ง์„ ๋“ค์–ด์•ผ ํ•  ์ง€ ๊ฐˆํ”ผ๋ฅผ ์žก์ง€ ๋ชปํ•  ๊ฒƒ์ด๋‹ค. ์ด์™€ ๊ฐ™์€ ์˜๋ฏธ์ด๋‹ค.

์—ฌ๋Ÿฌ ๊ฐœ์˜ @State ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋ฃนํ™”ํ•ด์„œ ์‚ฌ์šฉ

// struct

import SwiftUI

struct ButtonDatas {
    var showColors: Bool = false
    var animateButton: Bool = false
}

struct Home: View {
    
    @State private var buttonData = ButtonDatas()
    
    var body: some View {...}
    
    @ViewBuilder
    func SideBar() -> some View {...}
            .padding(.top, 20)
            .frame(height: buttonData.showColors ? nil : 0)
            .opacity(buttonData.showColors ? 1 : 0)
            .zIndex(0)
        }
        .frame(maxHeight: .infinity, alignment: .top)
        .padding(.vertical)
        .padding(.horizontal, 22)
        .padding(.top, 35)
    }
    
    @ViewBuilder
    func AddButton() -> some View {
        Button {
            withAnimation(.interactiveSpring(response: 0.5, dampingFraction: 0.6, blendDuration: 0.6)) {
                buttonData.showColors.toggle()
                buttonData.animateButton.toggle()
            }
            // Resetting the button
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
                withAnimation(.spring()) {
                    buttonData.animateButton.toggle()
                }
            }
        } label: {
            Image(systemName: "plus")
                .font(.title2)
                .foregroundColor(.white)
                .scaleEffect(buttonData.animateButton ? 1.1 : 1)
                .padding(isMacOS() ? 12 : 15)
                .background(Color.black)
                .clipShape(Circle())
        }
        .rotationEffect(.init(degrees: buttonData.showColors ? 45 : 0))
        .scaleEffect(buttonData.animateButton ? 1.1 : 1)
        .padding(.top, 30)

    }
}
// class 

class TextClass {
    var text1: String = ""
    var text2: String = ""
    
    init(text1: String, text2: String) {
        self.text1 = text1
        self.text2 = text2
    }
}

struct Home: View {
    
    @State private var textData = TextClass(text1: "์ฒซ๋ฒˆ์งธ", text2: "๋‘๋ฒˆ์งธ")
}

์š”์•ฝ

  • View์—์„œ ์†์„ฑ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ (๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋„๋ก)
  • ํ™”๋ฉด์— ์—…๋ฐ์ดํŠธ ๋œ ํ›„ ์œ ์ง€ํ•ด์•ผ ํ•  ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ
  • View์™€ ๊ฐ’ ํƒ€์ž… ๊ฐ„์— ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ

@State์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ๊ฐ’ ํƒ€์ž…

  • String
  • Int
  • Bool
  • struct
  • Array
  • Tuple
  • Dictionary
profile
์•ˆ๋‹ค๊ณ  ์ฐฉ๊ฐํ•˜์ง€ ๋ง๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€