본문 바로가기
Ios/Swift UI

키 패스 KeyPath 에 대해 알아봅시다

by 잘먹는 개발자 에단 2024. 7. 19.

* Swift 배운지 얼마되지 않았습니다. 양해바랍니다 :)

 

 

- Swift / SwiftUI를 배우다보면 다른 언어에서 볼 수 없는 것들이 많은 것 같습니다.

- 그러다보니 좀 생소한 표현법들이 많은 것 같아요.

- KeyPath도 좀 그런 느낌이긴한데...

 

\. 는 Swift의 KeyPath를 나타내는 문법입니다.

- 타입 안전한 방식으로 객체의 속성에 접근할 수 있게 해줍니다.

 

그럼 예시코드를 살펴보겠습니다.

 

import SwiftUI

struct ContentView : View{
	@Environment( /.layoutDirection ) var layoutDirection : LayoutDirection
    
    var body : some View{
    	Text(layoutDirection == .leftToRight ? "Left to Right", "Right to Left")
        	.padding()
    }
}

struct ContentView_Previews : PreviewProvider{
	static var previews : some View{
    	ContentView()
    }
}

 

먼저 예제에서는 Environment 속성을 사용하여 현재 환경의 layoutDirection을 가져옵니다.

 

\.layoutDirection은 EnvironmentValues 구조체에 정의된 layoutDirection KeyPath를 나타냅니다. 

 

이 KeyPath를 통해서 SwiftUI는 환경에서 해당 값을 가져와서 화면에 그릴 수 있습니다.

 

따라서 \.는 KeyPath의 시작을 나타내며, KeyPath를 사용하면 타입 안전한 방식으로 객체의 속성에 접근하고 사용할 수 있습니다.

 

 

 

그럼 궁금한 게 생깁니다.

EnvironmentValues 구조체는 어떤 것일까.

EnvironmentValues 구조체는 어떤 역할을 할까?

 

EnvironmentValues 구조체는 SwiftUI에서 다양한 [환경값]을 저장하고 제공하는 역할을 한다.

 

Swift UI 내부적으로 정의되어있고, 우리가 직접 정의할 필요는 없다.

 

그러나, 커스텀 환경 값을 추가하고 싶을 때는 EnvironmentKey 프로토콜을 구현하여 새로운 키를 만들 수 있다.

 

// 1. 커스텀 환경 키 정의
import Swift UI

// 커스텀 환경 키를 정의하는 구조체
struct CustomEnvironmentKey : EnvironmentKey{
	static let defaultValue : String = "Default Value"
}


// 2. EnvironmentValues에 커스텀 키 추가하기
extension EnvironmentValues{
	var customValue : String{
    	get { self[CustomEnvironmentKey.self] }
        set { self[CustomEnvironmentKey.self] = newValue }
    }
}


// 3. 커스텀 환경 값을 사용하는 뷰 정의하기
struct ContentView : View{
	@Environment(\.customValue) var customValue : String
    
    var body : some View{
    	Text("Custom Environment Value : \(customValue)")
        	.padding()
    }
}

// 4. 커스텀 환경 값을 설정하고 전달하기
struct ParentView : View{
	var body : some View{
    	ContentView()
        	.environment(/.customValue, "Hello Swift UI!")
    }
}