Documentation
pointfreeco.github.io
Initalization Rules
- Shared타입으로 선언하기 위해서 특별한 Intialize 규칙이 존재
- 이 룰은 어떠한 종류의 프로퍼티 래퍼에도 해당됩니다. (vanilSwiftUI에 해당하는 @state, @stateObject 등등)
- non-persited state일 경우 (@shared) sourth of trouth는 부모뷰에 존재한다.
- initalzier는 Shared value를 가져야 하며, underScored property로 할당할 수 있다.
public struct State {
@Shared public var count: Int
// other fields
public init(count: Shared<Int>, /* other fields */) {
self._count = count
// other assignments
}
}
- non-persited state일 경우 (@shared) sourth of trouth는 생성과 함께 존재한다.
- initalizer 는non-Shared로 전달하면, Shared value를 통해 shared로 만들어줄 수 있다.
public struct State {
@Shared public var count: Int
// other fields
public init(count: Int, /* other fields */) {
self._count = Shared(count)
// other assignments
}
}
- 가져오고 싶은 값이 persistency에 있고, nonpersistency로 선언하고 싶다면 아래와 같이 따라야 한다.
public struct State {
@Shared public var count: Int
// other fields
public init(count: Int, /* other fields */) {
self._count = Shared(wrappedValue: count, .appStorage("count"))
// other assignments
}
}
이 이니셜라이저에 전달된 값은 외부 저장소에 아직 값이 없는 경우에만 사용됩니다. 저장소에 값이 존재하면 이 값은 사용되지 않습니다. 실제로 init(wrappedValue:_:fileID:line:)의 wrappedValue 인수는 @autoclosure이므로 사용되지 않으면 평가되지도 않습니다. 따라서 실제로 사용되는 경우에만 평가되도록 이니셜라이저의 인수를 @autoclosure로 만드는 것이 좋습니다:
public struct State {
@Shared public var count: Int
// other fields
public init(count: @autoclosure () -> Int, /* other fields */) {
self._count = Shared(wrappedValue: count(), .appStorage("count"))
// other assignments
}
}
'Swift > TCA' 카테고리의 다른 글
[TCA] day 10 long living Effect (publisher Effect and async/await effect) (0) | 2024.05.05 |
---|---|
[TCA] day 10 Effect 취소 (TCA @Shared, Sheet) (0) | 2024.05.03 |
[TCA] day 9 Shared State활용한 TodosList 예제 (TCA @Shared, Sheet) (0) | 2024.05.01 |
[TCA] day 8 TCA 1.10 이후부터의 Shared State 관리(@Shared) (0) | 2024.04.30 |
[TCA] day 7 TCA의 Dependency에 대해서 (Effects-Basics) (0) | 2024.04.29 |