๐ŸŽ Apple/SwiftUI

[SwiftUI] @Environment

JINiOS 2023. 4. 23. 19:20
728x90

ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ @Environment

@Environment๋Š” SwiftUI์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ(wrapper)๋กœ, SwiftUI ๋ทฐ์˜ ์ปจํ…์ŠคํŠธ(Context)์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

@Environment๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ทฐ์—์„œ ์‹œ์Šคํ…œ์˜ ์„ค์ •์ด๋‚˜ ์ƒํƒœ์™€ ๊ฐ™์€ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์ •๋ณด์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ทฐ๊ฐ€ ๋‹คํฌ ๋ชจ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์šฉ์ž์˜ ๋กœ์ผ€์ผ์— ๋งž๊ฒŒ ํ…์ŠคํŠธ๋ฅผ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜, ์‹œ์Šคํ…œ์˜ ์•ก์„ธ์Šค ๊ถŒํ•œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@Environment๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ @State, @Binding, @ObservedObject ๋ฐ @EnvironmentObject์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋ชจ๋‘ SwiftUI์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. @Environment๋Š” ๋ทฐ์˜ ๋ Œ๋”๋ง์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋™์ ์ธ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ทฐ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

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

@Environment(\.colorScheme)

์˜ˆ๋ฅผ ๋“ค์–ด, @Environment(\.colorScheme)๋Š” ํ˜„์žฌ ์‹œ์Šคํ…œ์˜ ์ƒ‰์ƒ ์Šคํ‚ค๋งˆ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ƒ‰์ƒ ์Šคํ‚ค๋งˆ์˜ ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด SwiftUI๊ฐ€ ๋ทฐ๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

struct MyView: View {
    @Environment(\\.colorScheme) var colorScheme

    var body: some View {
        Text("Hello, world!")
            .foregroundColor(colorScheme == .dark ? .white : .black)
    }
}

@Environment(\.locale)

ํ˜„์žฌ ๋กœ์ผ€์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ทฐ์—์„œ ํ˜„์žฌ ์–ธ์–ด์— ๋งž๋Š” ํ…์ŠคํŠธ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

struct MyView: View {
    @Environment(\\.locale) var locale

    var body: some View {
        Text("Hello, world!")
            .font(.title)
            .foregroundColor(.blue)
            .frame(width: 200, height: 100)
            .overlay(Text("Current language: \\(locale.languageCode ?? "")"))
    }
}

@Environment(\.isEnabled)

ํ˜„์žฌ ๋ทฐ๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋‚ด์šฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

struct MyView: View {
    @Environment(\\.isEnabled) var isEnabled

    var body: some View {
        VStack {
            TextField("Enter text", text: .constant(""))
                .padding()
                .background(isEnabled ? Color.white : Color.gray)
                .disabled(!isEnabled)
            Button(action: {}) {
                Text("Submit")
            }
            .disabled(!isEnabled)
        }
    }
}

@Environment(\.presentationMode)

ํ˜„์žฌ ๋ทฐ์˜ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๋ชจ๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐ๋ฅผ ๋‹ซ๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ๋ทฐ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

struct MyView: View {
    @Environment(\\.presentationMode) var presentationMode

    var body: some View {
        VStack {
            Text("Hello, world!")
            Button(action: {
                presentationMode.wrappedValue.dismiss()
            }) {
                Text("Dismiss")
            }
        }
    }
}

์œ„ ์˜ˆ์‹œ๋“ค์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด @Environment๋Š” SwiftUI์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐ์—์„œ ์ปจํ…์ŠคํŠธ(Context)์— ๋Œ€ํ•œ ์ •๋ณด์— ์•ก์„ธ์Šคํ•˜๊ณ , ๋™์ ์œผ๋กœ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๋ฉฐ, ๋ทฐ๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

UIKit์—์„œ๋Š”?

@Environment์€ SwiftUI์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. UIKit์—์„œ๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฐœ๋…์œผ๋กœ, ์•ฑ์˜ ์ „๋ฐ˜์ ์ธ ์ƒํƒœ์™€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์•ฑ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ(App Delegate)๋‚˜ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ(View Controller)์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ(lifecycle method) ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

728x90