[SwiftUI] EnvironmentKey

environment에 있는 values에 접근하기 위한 key

원본 : https://developer.apple.com/documentation/swiftui/environmentkey

목적 : 꼼꼼한 학습을 위한 번역 및 정리

Declaration

protocol EnvironmentKey

Overview

새로운 property와 함께 EnvironmentValues structure를 확장하여 custom environment value를 생성할 수 있다. 첫 번째로, defaultValue property를 지정하고 새로운 environment key type을 정의해라.

private struct MyEnvironmentKey: EnvironmentKey {
    static let defaultValue: String = "Default value"
}

Swift compiler는 관련된 value type을 default value에 대해 저정한 유형으로 자동으로 추론한다.

그런 다음 새로운 environment value property를 정의하기 위해 key를 사용해라.

extension EnvironmentValues {
	var myCustomValue: String {
		get { self[MyEnvironmentKey.self] }
        	set { self[MyEnvironmentKey.self] = newValue }
	}
}

너의 environment value의 clients(이게 뭘 의미하는지 모르겠음.)는 직접적으로 절대 그 key를 사용하지 않는다. 대신에, 그들은 너의 custom environment value property의 key path를 사용한다.

view 그리고 모든 subviews를 위해 environment value를 설정하기 위해서, 해당 view에 environment(_: _:)view modifier를 추가해라.

MyView()
	.environment(\.myCustomValue, "Another string")

편의상, 이 environment value를 공급하기 위해 전용 view modifier를 정의할 수 있다.

extension View {
	func myCustomValue(_ myCustomValue: String) -> some View {
		environment(\.myCustomValue, myCustomValue)
	}
}

이것은 call하는 곳에서 명료함을 개선한다.

MyView()
		.myCustomValue("Another string")

MyView 또는 그의 자식 중 하나에서부터 그 value를 읽기 위해선, Environment property wrapper를 사용해라.

struct MyView: View {
	@Environment(\.myCustomValue) var customValue: String

	var body: some View {
		Text(customValue)
	}
}