Deep_Dev

 

โœ… Property Wrapper

์†์„ฑ(Property)์— ์ถ”๊ฐ€์ ์ธ ํ–‰๋™์ด๋‚˜ ๊ณ„์‚ฐ์„ ๋ง๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.

ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ๋กœ์ง์ด๋‚˜ ๊ณ„์‚ฐ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

 

โœ… PreView ( ์š”์•ฝ )

  • @State : ๋ทฐ ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๋กœ์ปฌ ์ƒํƒœ๊ฐ’ ์ €์žฅ
  • @Binding : ๋ถ€๋ชจ ๋ทฐ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๊ฐ’์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง
  • @ObservedObject : ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ณ  ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
  • @EnvironmentObject : ์•ฑ ์ „์ฒด์—์„œ ๊ณต์œ ๋˜๋Š” ์ƒํƒœ ๊ฐ์ฒด ์‚ฌ์šฉ
  • @Published : ObservableObject์˜ ์†์„ฑ์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ View๋ฅผ ์ž๋™ ๋ฆฌํ”„๋ ˆ์‹œ 
  • @AppStorage : UserDefaults์— ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์‚ฌ์šฉ
  • @SceneStorage : ์•ฑ์˜ 'Scene' ์„ธ์…˜ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • @Environment : ์‹œ์Šคํ…œ ์ œ๊ณต ํ™˜๊ฒฝ ์„ค์ •์— ์ ‘๊ทผ
  • @StateObject : ๋ทฐ๊ฐ€ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.
  • @FetchRequest : CoreData์˜ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ทฐ์— ์—ฐ๊ฒฐํ•œ๋‹ค.

 

โœ… @State

- ๋กœ์ปฌ ์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค ( ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ )

์žฅ์  : ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

๋‹จ์  : ํ•ด๋‹น View ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

์‚ฌ์šฉ : View์˜ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

์‚ฌ์šฉ ์ด์œ  : ์ƒํƒœ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ถ”์ ํ•˜๊ณ  UI๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ์œ„ํ•ด

์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ : View ๋‚ด๋ถ€์—์„œ @State ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜ ์„ ์–ธ

@State private var count = 0

์‚ฌ์šฉ ์˜ˆ์‹œ

struct ContentView: View {
	@State private var count = 0
    
    var body: some View {
    	Button("์นด์šดํŠธ ์ฆ๊ฐ€") {
        	count += 1
        }
        Text("ํ˜„์žฌ ์นด์šดํŠธ: \(count)")
    }
}

 

 

โœ… @Binding

์ƒ์œ„ View์˜ ์ƒํƒœ๋ฅผ ํ•˜์œ„ View์— ์ฐธ์กฐํ•˜๊ณ  ์กฐ์ž‘ํ•œ๋‹ค.

์žฅ์  : ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„๊ฐ€๋Šฅ

๋‹จ์  : ์ƒ์œ„ View์™€ ํ•˜์œ„ View๊ฐ€ ์ƒํƒœ์— ๋Œ€ํ•ด ๊ฐ•ํ•˜๊ฒŒ ์—ฐ๊ฒฐ

์‚ฌ์šฉ :  ์ƒ์œ„ View์˜ ์ƒํƒœ๋ฅผ ํ•˜์œ„ View์—์„œ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ

์‚ฌ์šฉ ์ด์œ  :  ์ƒํƒœ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๊ณต์œ ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.

์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ : ํ•˜์œ„ View์—์„œ @Binding ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ƒ์œ„ View์—์„œ ์—ฐ๊ฒฐํ•œ๋‹ค. 

@Binding var isOn: Bool

์‚ฌ์šฉ์˜ˆ์‹œ

struct SwitchView: View {
	@Binding var ioOn: Bool
    
    var body: some View {
    	Toggle("์Šค์œ„์น˜", isOn: $isOn)
    }
}

 

 

โœ… @ObservedObject 

๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ View์— ๋ฐ”์ธ๋”ฉ

์žฅ์  : ์—ฌ๋Ÿฌ View์—์„œ ๊ณต์œ ๊ฐ€๋Šฅ

๋‹จ์  : ObservableObject ํ”„๋กœํ† ์ฝœ์„ ์ ์šฉํ•œ ๋ณ„๋„์˜ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”

์‚ฌ์šฉ : ์—ฌ๋Ÿฌ ํ™”๋ฉด์—์„œ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ์ •๋ณด๋‚˜ ๋ณต์žกํ•œ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•  ๋•Œ ์—ฌ๋Ÿฌ View์—์„œ ๊ณต์œ ํ•  ๋•Œ ์‚ฌ์šฉ

          ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์ •๋ณด์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ! 

์‚ฌ์šฉ ์ด์œ  : ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  UI๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ : @ObservedObject ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํ•จ๊ป˜ ObservableObject๋ฅผ ์ ์šฉํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์‚ฌ์šฉ

@ObservedObject var viewModel: MyViewModel

์‚ฌ์šฉ์˜ˆ์‹œ

struct MyView: View {
	@ObservedObject var viewModel: MyViewModel
    
    var body: some View {
    	Text(viewModel.title)
    }
}

 

โœ… @EnvironmentObject 

์•ฑ ์ „์ฒด์—์„œ ๊ณต์œ ๋˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

์žฅ์  : ์•ฑ ์ „์ฒด์˜ ์ƒํƒœ๋ฅผ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

๋‹จ์  : ๋ช…์‹œ์ ์ธ ์ดˆ๊ธฐํ™”๊ฐ€ ์—†์œผ๋ฉด Runtime Error ๋ฐœ์ƒ ๊ฐ€๋Šฅ

์‚ฌ์šฉ : ์•ฑ ์ „์ฒด์—์„œ ๊ณต์œ ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ, ์•ฑ์˜ ๋ชจ๋“  ๊ณณ์—์„œ ์ ‘๊ทผํ•ด์•ผํ•˜๋Š” ํฐ ์ •๋ณด๋ฅผ ๋‹ด์„ ๋•Œ ์‚ฌ์šฉ ( ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊ทธ์ธ ์ƒํƒœ, ํ…Œ๋งˆ ์„ค์ • ๋“ฑ )

์‚ฌ์šฉ ์ด์œ  : ์•ฑ ์ „์ฒด์˜ ์ƒํƒœ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. 

์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ : @EnvironmentObject ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜ ์„ ์–ธ 

@EnvironmentObject var appData: AppData

์‚ฌ์šฉ์˜ˆ์‹œ

strcut ContentView: View {
	@EnvironmentObject var appData: AppData
    
    var body: some View {
    	Text("์ „์ฒด ์‚ฌ์šฉ์ž์ˆ˜ : \(appData.totalUsers)")
    }
}

 

โœ๏ธ State, ObservedObject, EnvironmentObject ๊ณตํ†ต์ 

๋ชจ๋‘ SwiftUI์—์„œ Data๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

 

โœ๏ธ State, ObservedObject, EnvironmentObject ์ฐจ์ด์ 

- ๋ฒ”์œ„ : State๋Š” ํ•˜๋‚˜์˜ View, ObservedObject๋Š” ์—ฌ๋Ÿฌ View, EnvironmentObject๋Š” ์•ฑ ์ „์ฒด์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

- ๋ณต์žก์„ฑ : State๋Š” ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ, ObservedObject์™€ EnvironmentObject๋Š” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ

 

โœ๏ธ ObservedObject์™€ EnvironmentObject ๊ณตํ†ต์ 

์ƒํƒœ ๊ด€๋ฆฌ ๊ฐ์ฒด๋ฅผ View์™€ ์—ฐ๊ฒฐ

 

โœ๏ธ ObservedObject์™€ EnvironmentObject ์ฐจ์ด์ 

ObservedObject๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•˜๋ฉฐ, EnvironmentObject๋Š” ์•ฑ ์ „์ฒด์— ์ฃผ์ž…๋œ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ฐพ์Œ

 

โœ๏ธ State์™€ Binding ๊ณตํ†ต์ 

์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ

 

โœ๏ธ State์™€ Binding ์ฐจ์ด์ 

์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๋‹ค. State๋Š” View๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , Binding์€ ์ƒ์œ„ View์™€ ํ•˜์œ„ View ์‚ฌ์ด์—์„œ ์ƒํƒœ๋ฅผ ๊ณต์œ 

 


โœ… @Published 

ObservedObject์˜ ์†์„ฑ์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ View๋ฅผ ์ž๋™์œผ๋กœ ๋ฆฌํ”„๋ ˆ์‹œ(ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด "์—ฌ๊ธฐ ๋ณ€ํ–ˆ์–ด์š”! ๋ทฐ ๋‹ค์‹œ ๊ทธ๋ ค์ฃผ์„ธ์š”!" ๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ์—ญํ•  )

์žฅ์  : ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐ , ObservableObject์™€ ์ž˜ ์—ฐ๋™๋จ

๋‹จ์  :  ํŠน์ • ์†์„ฑ์—๋งŒ ์ ์šฉ, ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ

์‚ฌ์šฉ :  ObserableObject์˜ ํŠน์ • ์†์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ๋•Œ

์‚ฌ์šฉ ์ด์œ  : ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์‰ฝ๊ฒŒ ๊ฐ์ง€ํ•˜๊ณ  UI๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ

์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ : @Published ์–ด๋…ธํ…Œ์ด์…˜์„ ์†์„ฑ ์•ž์— ์ถ”๊ฐ€

์‚ฌ์šฉ์˜ˆ์‹œ

class Counter: ObservableObject {
	@Published var count = 0 // ์ด ๋ณ€์ˆ˜๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ๋ทฐ๋Š” ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
}

struct ContentView: View {
	@ObservedObject var counter = Counter()
    
    var body: some View{
    	Text("Count: \(counter.count)")
    }
}

@Published๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋ทฐ์— ์•Œ๋ ค์ฃผ์–ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๊ฒŒ ํ•˜๋Š” ๋งค์šฐ ์œ ์šฉํ•œ ๋„๊ตฌ

 

โœ… @AppStorage 

์‚ฌ์šฉ์ž ๊ธฐ๋ณธ ์„ค์ •์„ ์‰ฝ๊ฒŒ ์ €์žฅํ•˜๊ณ  ์กฐํšŒ

์žฅ์  : UserDefaults๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„ํŽธํ•˜๋‹ค.

๋‹จ์  : ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.

์‚ฌ์šฉ : ์‚ฌ์šฉ์ž ์„ค์ •์„ ์ €์žฅํ•˜๊ณ  ์กฐํšŒํ•  ๋•Œ

์‚ฌ์šฉ ์ด์œ  : ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ์ด ํ•„์š”ํ•  ๋•Œ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ด๋‹ค.

์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ : @AppStorage์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํ•จ๊ป˜ ์ €์žฅ ํ‚ค๋ฅผ ์ง€์ •

@AppStorage("user_name") var userName: String = "Guest"

์‚ฌ์šฉ์˜ˆ์‹œ

struct ContentView: View{
	@AppStorage("user_name") var userName: String = "Guest"
    
    var body: some View{
    	Text("ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค, \(userName)")
    }
}

 

 

โœ… @SceneStorage 

์•ฑ์˜ ๋‹ค์–‘ํ•œ Scene์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›

์žฅ์  : ์ƒํƒœ ๋ณต์›์ด ์‰ฝ๋‹ค.

๋‹จ์  : ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Œ ( ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ œํ•œ, ๋กœ์ปฌ ์ €์žฅ์ด๋ผ ์—ฌ๋Ÿฌ ๋””๋ฐ”์ด์Šค๊ฐ„์˜ ์ƒํƒœ ๊ณต์œ  X)

์‚ฌ์šฉ : ์•ฑ์˜ ๋‹ค์–‘ํ•œ '์žฅ๋ฉด'๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ณต์œ ์‹œ ์‚ฌ์šฉ

์‚ฌ์šฉ ์ด์œ  : ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ๋‹ค์‹œ ์—ด์—ˆ์„ ๋•Œ ์ด์ „ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•˜๊ธฐ ์œ„ํ•ด

์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ : @SceneStorage๋ฅผ ๋ณ€์ˆ˜ ์•ž์— ์‚ฌ์šฉํ•œ๋‹ค.

์‚ฌ์šฉ ์˜ˆ : ํƒญ์˜ ์„ ํƒ ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ. ex ํƒญ ์„ ํƒ ์ƒํƒœ

์‚ฌ์šฉ์˜ˆ์‹œ

struct ContentView: View{
	@SceneStorage("selectedTab") var selectedTab: String?
    
    var body: some View{
    	TabView(selection: $selectedTab){
        	Text("Tab 1")
            	.tabItem {
                	Text("Tab 1")
                }
                .tag("firstTab")
                
            Text("Tab 2")
            	.tabItem{
                	Text("Tab 2")
                }
                .tag("secondTab")
        }
    }
}

์ฐธ๊ณ ๋กœ ์ด ์˜ˆ์‹œ๋Š”, ํƒญ์˜ ์„ ํƒ ์ƒํƒœ๋Š” selectedTab ๋ณ€์ˆ˜์— ์ €์žฅ๋˜๊ณ , ์•ฑ์ด ์ข…๋ฃŒ๋œ ํ›„ ๋‹ค์‹œ ์‹คํ–‰๋  ๋•Œ ์ด ์ƒํƒœ๋ฅผ ๋ณต์›ํ•œ๋‹ค.

 

๐Ÿ“Œ ๋‹ค๋ฅธ ์˜ต์…˜ ?

  • @AppStorage : ๋น„์Šทํ•˜์ง€๋งŒ ์•ฑ ์ „์ฒด์˜ UserDefaults๋ฅผ ์‚ฌ์šฉ. @SceneStorage๋Š” ํŠน์ • 'Scene'์— ๊ตญํ•œ๋œ ์ƒํƒœ๋ฅผ ์ €์žฅํ•œ๋‹ค.

๐Ÿ“Œ AppStorage, SceneStroage ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ 

  • ๊ณตํ†ต์  : ๋‘˜๋‹ค ์•ฑ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
  • ์ฐจ์ด์  : AppStorage๋Š” ์•ฑ ์ „์ฒด์— ๊ฑธ์ณ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•˜๋ฉฐ, @SceneStorage๋Š” ํŠน์ • 'Scene'์—์„œ๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•จ

 

โœ… @Environment 

์‹œ์Šคํ…œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋‚˜ ์•ฑ ์„ค์ •์„ View๋กœ ์ฃผ์ž…

์žฅ์  : ์ „์—ญ ์„ค์ •์„ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ

๋‹จ์  : ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ‚ค๊ฐ€ SwiftUI์— ์˜ํ•ด ์ œํ•œ๋จ

์‚ฌ์šฉ : ์‹œ์Šคํ…œ ์„ค์ •์„ View์—์„œ ํ•„์š”๋กœ ํ•  ๋•Œ

์‚ฌ์šฉ ์ด์œ  : ์‹œ์Šคํ…œ ์„ค์ •์— ์‰ฝ๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด

์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ : @Environment์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํ•จ๊ป˜ ํŠน์ • ํ‚ค๋ฅผ ์‚ฌ์šฉ

@Environment(\.locale) var locale

์‚ฌ์šฉ์˜ˆ์‹œ

struct ContentView: View{
	@Environment(\.locale) var locale
    
    var body: some View {
    	Text("ํ˜„์žฌ ๋กœ์ผ€์ผ: \(locale)")
    }
}

 

โœ๏ธ AppStorage์™€ Environment ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ 

  • ๊ณตํ†ต์  : ๋‘˜ ๋‹ค ์„ค์ •๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์กฐํšŒํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
  • ์ฐจ์ด์  : AppStorage๋Š” ์‚ฌ์šฉ์ž ์„ค์ •์„ UserDefaults์— ์ €์žฅ, Environment๋Š” ์‹œ์Šคํ…œ ํ™˜๊ฒฝ ์„ค์ •์„ ๊ฐ€์ ธ์˜ด

โœ… @StateObject

์†Œ์œ ๊ถŒ์„ ๊ฐ€์ง€๋Š” ์˜ต์ €๋ฒ„๋ธ” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ €์žฅ ( SwiftUI์—์„œ ์ฐธ์กฐ ํƒ€์ž…์˜ ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์†Œ์œ ํ•˜๊ณ  ๊ด€๋ฆฌ)

์žฅ์  : ์ƒํƒœ ์†Œ์œ ๊ถŒ ( ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์†Œ์œ  ๋ฐ ๊ด€๋ฆฌ), ๋ฐ์ดํ„ฐ ๊ณต์œ (์—ฌ๋Ÿฌ ๋ทฐ์—์„œ ๊ณต์œ  ๊ฐ€๋Šฅ)

๋‹จ์  :  ๋‹จ์ผ ๋ทฐ์—์„œ๋งŒ ์†Œ์œ ํ•  ์ˆ˜ ์žˆ์Œ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ( ๊ฐ์ฒด๊ฐ€ ๋ทฐ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์œ„ํ—˜ )

์‚ฌ์šฉ : ๋ทฐ์™€ ๋ทฐ ๊ณ„์ธต์—์„œ ๊ณต์œ ๋˜์–ด์•ผ ํ•˜๋Š” ์ƒํƒœ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

์‚ฌ์šฉ ์ด์œ  : ๋ฐ์ดํ„ฐ์˜ ์†Œ์œ ๊ถŒ๊ณผ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ๋˜๋Š” ์ƒํƒœ๋ฅผ ๋ทฐ ๊ณ„์ธต์— ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ : @StateObject ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ณ€์ˆ˜ ์•ž์— ๋ถ™์—ฌ ์‚ฌ์šฉ

์‚ฌ์šฉ ์˜ˆ : viewModel์„ ๋ทฐ์—์„œ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•  ๋•Œ 

์‚ฌ์šฉ์˜ˆ์‹œ

class Counter: ObservableObject{
	@Publised var count = 0
}

struct ContentView: View {
	@StateObject var counter = Counter()
    
    var body: some View{
    	VStack {
        	Text("Count: \(counter.count)")
        	Button("Increment") {
            	counter.count += 1
            }
        }
    }
}

@StateObject๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Counter๋ผ๋Š” ObservableObject๋ฅผ contentView๋‚ด์—์„œ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ฝ”๋“œ ์˜ˆ์ œ.

์ด ์˜ˆ์ œ์—์„œ Counter๋Š” ์ƒํƒœ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ํด๋ž˜์Šค์ด๊ณ , @Publised ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ count๋ณ€์ˆ˜์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€.

CouterView๋Š” ์ด Counter ๊ฐ์ฒด๋ฅผ @StateObject๋กœ ์„ ์–ธํ•˜์—ฌ ๋ทฐ๊ฐ€ ์†Œ๋ฉธ๋˜์–ด ๋‹ค์‹œ ์ƒ์„ฑ๋  ๋•Œ์—๋„ Counter๊ฐ์ฒด๊ฐ€ ์œ ์ง€๋˜๊ฒŒ ํ•จ.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Counter์˜ ์ƒํƒœ๊ฐ€ ContentView์— ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ”์ธ๋”ฉ๋˜๊ณ , 'Increment'๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด count๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋ฉด์„œ UI๊ฐ€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋จ.

 

โœ… @FetchRequest

Core Data ํŒจ์น˜ ์š”์ฒญ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”์ธ๋”ฉํ•จ

์žฅ์  : CoreData ํ†ตํ•ฉ์ด ๋งค์šฐ ์‰ฌ์›€. ์ž๋™ ์—…๋ฐ์ดํŠธ ( CoreDate ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ž๋™ ๋ฐ˜์˜ )

๋‹จ์  : CoreData์—๋งŒ ํŠนํ™”๋˜์–ด์žˆ์Œ( Only CoreData), ์ฟผ๋ฆฌ์ œํ•œ(๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์—†์Œ)

์–ธ์ œ ์‚ฌ์šฉ : CoreData๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰, ์ด๋ฅผ ๋ทฐ์— ํ‘œ์‹œํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ

์™œ ์‚ฌ์šฉ : CoreData ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ค๊ณ  UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด

์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ : @FetchRequest ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ณ€์ˆ˜ ์•ž์— ๋ถ™์—ฌ ์‚ฌ์šฉ

์‚ฌ์šฉ ์˜ˆ : CoreData์˜ ์—”ํ‹ฐํ‹ฐ ๋ชฉ๋ก์„ ํ…Œ์ด๋ธ” ๋ทฐ์— ํ‘œ์‹œํ•  ๋•Œ

์‚ฌ์šฉ์˜ˆ์‹œ

import SwiftUI
import CoreData

struct ContentView: View {
	@FetchRequest(
    	sortDescriptors: [NSSortDecriptor(keyPath: \Item.timestamp, ascending:true)],
        animation: .default)
    private var items: FetchedResults<Item>
    
    var body: some View{
    	List {
        	ForEach(items) { item in
            	Text("Item at \(item.timestamp!, formatter: itemFormatter")
            }
        }	
    }
}

๐Ÿ“Œ ๋‹ค๋ฅธ ์˜ต์…˜๊ณผ์˜ ์ฐจ์ด์ 

  • ObservedObject์™€์˜ ์ฐจ์ด์  : ObservedObject๋Š” ์ผ๋ฐ˜์ ์ธ ObservableObject๋ฅผ ๋ฐ”์ธ๋”ฉํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ, FetchRequest๋Š” CoreData์™€ ํŠนํ™”๋˜์–ด์žˆ๋‹ค.

๐Ÿ“Œ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ 

  • ๊ณตํ†ต์  : ๋‘˜ ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ์— ๋ฐ”์ธ๋”ฉํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
  • ์ฐจ์ด์  : @StateObject์€ ์ผ๋ฐ˜์ ์ธ ์ƒํƒœ๊ด€๋ฆฌ์— ์‚ฌ์šฉ, FetchRequest๋Š” CoreData์™€ ํŠนํ™”

 


โœ… ๋ฐ์ดํ„ฐ์˜ ์†Œ์œ ์™€ ๋ฒ”์œ„

  • ์ƒํƒœ๊ด€๋ฆฌ ( @State, @Binding, @ObservedObject, @StateObject, @EnvironmentObject) : ์ด๋“ค์€ ๋ฐ์ดํ„ฐ์˜ ์ƒํƒœ๋ฅผ ๋ทฐ์™€ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ์—ญํ• 
  • ๋ฐ์ดํ„ฐ ์ €์žฅ ( @AppStorage, @SceneStorage) : ์ด ๋‘ ๋ž˜ํผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ์—ญํ• 
  • ์‹œ์Šคํ…œ ์ •๋ณด ์ ‘๊ทผ ( @Environment, @FetchRequest) : ์ด๋“ค์€ ์•ฑ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์ด๋‚˜ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋‹ด๋‹น

 

โœ… ์•Œ๋ฆผ ๋ฉ”์ปค๋‹ˆ์ฆ˜

  • ์ž๋™์•Œ๋ฆผ ( @State, @Published, @ObservedObject, @EnvironmentObject, @StateObject) : ์ด๋“ค์€ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์ž๋™์œผ๋กœ ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธ
  • ๋ช…์‹œ์  ์•Œ๋ฆผ ( @Binding, @Environment, @FetchRequest, @AppStorage, @SceneStorage) : ์ด๋“ค์€ ์ƒํƒœ๋‚˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ์™ธ๋ถ€ ์š”์ธ( ์‚ฌ์šฉ์ž ์•ก์…˜, ์‹œ์Šคํ…œ ์„ค์ • ๋“ฑ)์— ์˜์กดํ•˜๋ฉฐ, ๋ทฐ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Œ

 

โœ… ๋ฐ์ดํ„ฐ์˜ ์ƒ๋ช…์ฃผ๊ธฐ

  • ๋ทฐ ์ƒ๋ช…์ฃผ๊ธฐ (@State, @Binding, @ObservedObject) : ์ด ๋ž˜ํผ๋“ค์€ ๋ทฐ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€
  • ์•ฑ ์ƒ๋ช…์ฃผ๊ธฐ (@AppStorage, @SceneStorage, @EnvironmentObject, @StateOjbect) : ์ด ๋ž˜ํผ๋“ค์€ ์•ฑ์ด๋‚˜ ์”ฌ(Scene)์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋™์•ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€

 

โœ… ๋ฐ์ดํ„ฐ ์†Œ์Šค

  • ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ (@State ,@Binding, @ObservedObject, @StateObject) : ์ด๋“ค์€ ์ฃผ๋กœ ์•ฑ ๋‚ด๋ถ€์—์„œ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃธ
  • ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ (@Environment, @FetchRequest, @AppStorage, @SceneStorage, @EnvironmentObject) : ์ด๋“ค์€ ์ฃผ๋กœ ์•ฑ ์™ธ๋ถ€(์‹œ์Šคํ…œ ์„ค์ •, ํŒŒ์ผ, ๋„คํŠธ์›Œํฌ ๋“ฑ)์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ

'๐ŸŽ iOS > SwiftUI' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[SwiftUI] NavigationStack  (0) 2024.04.04
[SwiftUI] Property Wrapper โ‘ก  (3) 2024.03.27
[iOS][SwiftUI] @State @Binding  (1) 2024.01.07
[iOS][SwiftUI] Save Color in UserDefaults  (0) 2024.01.01
[iOS][SwiftUI] @main @UIApplicationMain  (0) 2023.12.28