코딩에서 항상 중요시 여겨지는것중 클린코드가 있습니다.
클린코드에서 가장 기본이 되고 중요한 것은 중복된 코드를 제거하는것이다.
그 방법 중 가장 쉬운 방법은 메서드로 공통된 로직을 묶어서, 호출만 다른 시점에서 해주는것이다.
이런 방식을 Property에서는 수행 할 수 있도록 하는것이 Property wrapper이다.
Property Wrapper는 Swift 5.1에서 추가되었고, 특별한 기능을 갖는 속성을 정의하는데 사용된다.
그 기능을 갖게 함으로써 코드의 가독성을 높여준다. (쉽게 말해 변수의 기능을 확장해준다)
struct Recteangle {
private var width: Int
private var height: Int
init(width: Int, height: Int) {
self.width = width
self.height = height
}
var limitedWidth: Int {
get { return min(width, 10) }
set { width = newValue }
var limitedHeigth: Int {
get { return min(height, 10) }
set { height = newValue }
}
@propertyWrapper struct LimitedValue {
pirvate var value: Int = 0
var wrappedValue: Int {
get { self.value }
set { value = min(10, newValue) }
}
}
struct Rectangle {
@LimitedValue var width: Int
@LimitedValue var height: Int
}
사용 전의 예시는 다른 변수를 생성할때마다 같은 코드를 반복해줘야한다. 그 과정 자체가 매우 비효율적이고 가독성이 떨어진다.
반면 사용 후의 예시는 다른 변수를 생성할때 @LimitedValue 붙여주고 변수를 생성하면 같은 속성을 가진 변수로 생성된다.
기능
요약

기능
요약

이 경우 SubView에 기존에 @State 변수를 전달한게 아니라 새로운 @State 변수가 생성된 것이다.
그래서 버튼을 눌러도 `SubView의 숫자는 오르지않는다.

이 예시는 SubView(number: number)로 SubView의 변수로 전달을 했기 때문에 버튼을 눌렀을때두 숫자 모두 증가한다.

하지만 SubView도 값을 증가시키는 버튼을 만들어 사용하려하면, 값을 변경할 수 없다는 에러가 발생한다.
@State 사용 시 @State가 선언된 곳에서는 값을 변경할 수 있지만, 다른 뷰에서 호출된 경우에는 값 변경이 불가능하다. 이럴때 필요한것이 @Binding이다.

전달받은 곳에서 수정하고 싶다면 Binding으로 변환해서 전달해주기.
넘겨주는 곳에서 $, 받는곳에서 @Binding으로 기억하면 편하다.
Property Wrapper의 기능 중 하나이다.
$ 기호를 붙이면 Property Wrapper에 저장된 값을 Projected Value로 변환시켜준다.
그러면 이 변수에 저장되어 있는 값을 지정된 타입으로 변경시키고 반환해준다.
@State에서 이 기능을 사용해서 을 붙이면 타입에 맞게 알아서 변환시켜줌)
기능
요약

ObservableObject 프로토콜을 따르는 클래스 TimerData를 만든다.
1초씩 증가시킬 변수 timeCount의 변경 사항을 감지해야하기 때문에 @Published로 지정한다.

ContentView SecondView 둘 다 timerData를 @ObservedObject로 지정했기 때문에 변경 사항을 감지해서 뷰에 반영해주기 때문에 1초 시간이 지날때마다 Text에 숫자가 증가한다.(2개의 뷰 모두 같은 시간이 흐른다.) reset을 해도 두 뷰 모두 반영되어 0초가 되어있다.


기능
environmentObject(_:) 함수를 통해 주입하면, 해당 객체는 모든 하위 뷰에서 직접 참조하여 사용할 수 있게 됩니다.요약
여러 뷰 간에 데이터를 공유하고 싶을때 사용한다.
환경에 공유된 데이터를 전역적으로 사용할 수 있기 때문에 뷰가 전달할 필요 없이 모든 뷰에서 접근가능.
전역 데이터가 변경될 때마다 해당 객체를 사용하는 모든 뷰를 다시 그린다.

ObservalbeObject 프로토콜을 준수하는 클레스를 만든다.

최상위 뷰에서 EnviromentObject로 사용할 UserData 인스턴스 생성하고 주입해준다.

최상위뷰에 주입된 데이터를 사용할 각각의 뷰에서 직접 참조해여 사용할 수 있다.


기능
요약
사용하려는 공유 데이터의 이름을 SwiftUI에서 제공하는 keyPath를 전달하여 사용한다.
뷰가 생성되는 시점에 값이 자동으로 초기화된다.

환경 변수로 colorScheme값을 사용하여 현재 화면모드에 따라 Text를 출력해준다.
SwiftUI에서 제공해주는 colorScheme값을 사용하여 화면모드를 간단하게 구별할 수 있다.

다크모드