iOS 스터디 Part4 Result Builders
Result Builders.
함수나 프로퍼티에 여러 개의 표현식을 결합하여 하나의 값으로 만들 수 있게 해주는 특별한 종류의 함수
예제로 HStack 함수를 보면 @ViewBuilder를 확인할 수 있고 실제로 Builder 함수입니다.
struct HStack<Content>: View where Content: View {
public init(
alignment: VerticalAlignment = .center,
spacing: CGFloat? = nil,
@ViewBuilder content: () -> Content)
// ...
}우리는 이 함수를 사용하여 아래와 같이 각기 다른 3가지 표현식을 사용합니다.
이 부분은 컴파일러가 View Builders의 buildBlock이라는 정적 메소드를 사용하여 결합시킵니다.
위 HStack를 다시 작성하면 아래와 같이 쓸 수 있습니다.
결과적으로 @resultBuilder를 반환하게 되는데 여러 개의 표현식을 정적 메소드를 활용하여 하나로 만들어주는 함수라고 생각된다.
Blocks and Expressions.
@resultBuilder는 하나 이상의 buildBlock 메서드를 요구하고 빌더 메소드는 기본적으로 buildBlock, buildExpression 두 가지 정적 메소드를 사용할 수 있습니다.
기본적으로는 buildBlock를 사용하지만,
다양한 유형의 표현식에서는 buildExpression을 먼저 적용하고 사용하는 방식도 가능합니다.
예를 들어,
아래와 같이 buildBlock을 선언하고 @StringBuilder를 작성하면
Swift에서는 컴파일러에 의해 아래와 같이 재작성된다.
이것을 유형에 따라 buildExpression으로 표현해줄 수 있다.
Swift에서는 컴파일러에 의해 아래와 같이 재작성된다.
하나의 유형으로 사용할 때는 일반적으로 buildBlock만으로도 충분하지만
buildExpression를 적절히 이용하여 준다면 다양한 유형을 지원할 수 있을 것 같다.
Overloading Builder Methods.
빌더 함수에서 사용할 수 없는 유형의 경우 buildExpression를 이용하여 사용하도록 할 수도 있다.
never 유형을 overloading하므로 fatalError를 사용할 수 있게 된다.
void 유형을 overloading하므로 인쇄할 수 있게 된다.
지원되지 않는 유형에 대한 정확한 컴파일러 진단을 위해 쓸 수도 있다.
Conditions.
buildIf 및 buildEither를 활용하여 builder에 if, else, switch 기능 지원
buildIf: 조건 충족하지 않으면 nil.
Swift에서는 컴파일러에 의해 아래와 같이 재작성된다.
buildEither: 조건이 거짓일 때 컨텐츠 생성
Swift에서는 컴파일러에 의해 아래와 같이 재작성된다.
Loops.
buildArray를 활용하여 for..in 반복문을 이용하는 기능 지원
Swift에서는 컴파일러에 의해 아래와 같이 재작성된다.
Other Build Methods.
buildLimitedAvailability
제한된 가용성 컨텍스트를 다룰 수 있습니다.
buildFinalResult: 최종 결과는 해당 메서드에 대한 호출이 됩니다. 이 변환은 항상 마지막 입니다.
Unsupported Statements.
위에서 지원하는 if/if let, if ... else, switch, for ... in를 제외한 guard, defer, do ... catch, break, continue를 포함한 거의 모든 다른 문은 지원되지 않습니다.(2022년 기준)
Last updated