안녕하세요.
이번에는 Swift 5.4에 추가된 Result Builders 타입에 대해 알아볼게요.
# resultBuilder 란?
resultBuilder는 클래스, 구조체, enum에서 사용할 수 있고, 중첩된 데이터 구조를 만드는데 유용합니다.
Int 배열 여러 개를 하나의 Int 배열로 묶는 변수가 있다고 해볼게요.
위 같은 방식이라면 element를 추가할 때마다 + 연산자를 계속해서 넣어줘야 합니다.
이때 resultBuilder를 사용하면 좀 더 깔끔하게 사용할 수 있습니다.
(+ 연산자가 필요 없고, 선언형처럼 사용할 수 있어요.)
ArrayBuilder라는 구조체를 만들고 @resultBuilder 속성을 적용했을 땐 아래처럼 사용할 수 있습니다.
어떻게 이게 가능한 것일까요?
@resultBuilder는 일종의 매크로 같은 성격을 가지고 있습니다.
그래서 compile time 때 코드가 자동으로 생성(수정?)됩니다.
그리고 @resultBuilder의 buildBlock이란 static method는 선언된 여러 Component(여기선 Int 배열이겠죠?)를 하나의 Component로 묶어주는 역할을 합니다.
즉, 위 코드는 compile time 때 아래처럼 바뀌는 것이죠ㅎㅎ
# resultBuilder의 static method
## buildBlock
위에서 살펴봤으니 패스.
## buildExpression
buildBlock method의 파라미터는 Component 타입으로 동일했습니다.
다른 타입을 사용하고 싶으면, 해당 타입을 Component 타입으로 변환해 줘야겠죠? 이때 buildExpression static method를 사용합니다.
위에서 소개한 예시에서, 블록 안에서 Int 배열이 아닌 그냥 Int를 선언해도 배열에 추가될 수 있도록 하고 싶다면 아래처럼 구현하면 되고
compile time 때는 아래처럼 코드가 변경될 것입니다.
## buildArray
반복문을 사용하는 경우 구현해야 하는 method 입니다.
## buildOptional
else 문이 없는 if 구문을 사용하는 경우 구현해야 하는 method 입니다.
## buildEither
if-else 문을 사용하는 경우 구현해야 하는 method 입니다.
if 문에 해당하는 경우 buildEither(first:)가, else 문에 해당하는 경우 buildEither(second:)가 호출됩니다.
만약 if-elseif-else 구문인 경우, if와 elseif를 하나의 if로 묶어서 보고, 하나로 묶은 if는 재귀적으로 다시 if와 else로 나눕니다.
## buildFinalResult
buildBlock method로 인해 생성된 Component를 인자로 받아서 특정 결과값을 반환하는 가장 마지막에 호출되는 method 입니다.
Component와 다른 타입의 결과값을 반환하고 싶을 때 구현해야 하는 method 입니다.
## buildLimitedAvailability
if #available 같은 limited-availability context를 사용하는 경우 구현해야 하는 method 입니다.
# @ViewBuilder는 resultBuilder 이다!
여담으로, SwiftUI의 ViewBuilder도 resultBuilder 선언이 되어 있습니다.
View 프로토콜의 body 프로퍼티에 resultBuilder 선언이 된 ViewBuilder 속성이 적용되었기 때문에, body 안에 선언형으로 화면을 구성할 수 있었던 것입니다!!
# 참고
- https://github.com/apple/swift-evolution/blob/main/proposals/0289-result-builders.md
이번 글은 여기서 마무리.
'Swift' 카테고리의 다른 글
KeychainAccess Array 저장 API 추가하기 (0) | 2023.04.20 |
---|---|
CasePaths 맛보기 (0) | 2023.04.02 |
@dynamicMemberLookup (0) | 2023.03.06 |
computed property vs method (0) | 2023.01.13 |
mutating (1) | 2022.12.18 |