iOS 스터디 Part4 Result Builders

Advanced Swift (by Chris Eidhof) 책을 번역 후 참고하여 작성하였습니다.

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