티스토리 뷰

Mobile/iOS

iOS - Swift. SwiftUI. @Environment

out of coding 2023. 2. 7. 15:58

@Environment?

뷰에서 EnvironmentValues의 특정 요소를 읽어와 뷰 구성에 반영할 때에 사용하는 요소라고 합니다.

이것 또한 Injection 관련된 부분으로 보이는데, 좋은건 다 가지고 와주길 바랍니다.

누구는 그냥 자동으로 다 되니깐 싫다고 하겠지만 타이핑을 조금 하게 되는건 정말 행복한겁니다.

 

자... 그럼 일단 우리가 프로젝트를 하나 만들때에 CoreData, SwiftUI를 포함해서 만든다고 합시다.

XYZApp 파일을 보면 다음과 같은 부분이 있어요.

App file 이라고 하면 다들 아시겠죠? ㅎㅎㅎ

var body: some Scene {
    WindowGroup {
        ContentView()
            .environment(\.managedObjectContext, persistenceController.container.viewContext)
    }
}

그럼 우리가 처음에 불러오는 ContentView에 environment에 managedObjectContext에 persistenceController.container.viewContext를 넣어주고 있네요.

 

그럼 이번에는 ContentView로 가보겠습니다.

struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext
    @Environment(\.layoutDirection) var layoutDirection

    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)],
        animation: .default)
    private var items: FetchedResults<Item>
    ...
}

다른거 다 생각하지 말고 위에 @Environment를 봅시다. 

딱 느낌이 오지 않나요?

viewContext 변수에 저걸 그냥 넣어주는거에요.

 

이제부터는 그럼 ContentView에서는 viewContext를 통해서 그냥 NSManagedObjectContext에 접근이 가능합니다.

그냥 View에서 사용하는것들을 주입하여 주고 아주 쉽게 사용 할 수 있도록 하여주는거에요.

와... 뭐야... Injection 입니다. ㅎㅎ

 

이렇게 엄청 쉽게 주입한걸 그냥 선언만 해서 사용할수 있습니다.

아주 짧은 타이핑으로도 변경해주는것이죠.

 

자 그럼 시스템에서 지정해주는것 말고 다른것을 넣어주어서 사용하고 싶다면?

Custom이 가능합니다.

Custom Environment 만들어 봅시다.

두가지를 해야합니다.

EnvironmentKey를 채택해서 타입을 만들어주고, 이것을 EnvironmentValues에 추가하여줍니다.

뭔소릴까요? 그래서 코드를 만들었습니다.

private struct ExtraColorKey: EnvironmentKey {
    static let defaultValue = Color.secondary
}

extension EnvironmentValues {
    var extraColorKey: Color {
        get { self[ExtraColorKey.self] }
        set { self[ExtraColorKey.self] = newValue }
    }
}

넣어줄때는?

이렇게 넣어주기만 하면 됩니다.

ContentView()
    .environment(\.managedObjectContext, persistenceController.container.viewContext)
    .environment(\.extraColorKey, Color.cyan)

 

사용할때는?

@Environment(\.extraColorKey) var extraColor

비교적 쉽게 사용이 가능합니다. ㅎ

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함