Swift 5.4 업데이트 내역

2021년 5월 8일 수정

이 글은 Swift 5.4 버전의 업데이트 내역 중 문법적으로 변경되거나 추가된 것들만 간략이 정리한다. 참고로 Xcode 12.5 버전에 포함된 버전이 5.4다.

생략된 멤버 접근 강화 (SE-0287)

5.4 부터 아래와 같이 코드를 쓸 수 있다는 말이다. foregroundColor 를 지정하는 부분만 보면 된다.

struct SomeView: View {
    var body: some View {
        Text("Hello World")
            .foregroundColor(.black.opacity(0.5))
    }
}

기존에도 .black 코드처럼 Color.black 코드를 간략하게 표기할 수 있었지만 위 예제의 .black.opacity() 코드 처럼 체인을 붙이는 순간 빌드 에러가 생겼다. 다행히도 5.4 부터는 이런 체인 호출 코드도 이렇게 간략하게 쓸 수 있게 되었다.

다중 가변 매개변수 지원 (SE-0284)

예를 들어 아래와 같은 하나 이상의 매개변수를 원하는 대로 지정하는 데 사용하는 가변 매개변수(variadic parameters)를 둘 이상 한꺼번에 정의하는 것이 가능하다는 말이다.

func foobar(_ foo: Int..., bar: String...) { ... }

이런 함수는 아래와 같은 식으로 호출할 수 있다.

foobar(1, 2, 3, bar: "a", "b", "c")

라벨이 있기 때문에 직관적인 것 같다.

Result Builders (SE-0289)

SwiftUI의 View는 상당히 독특한 문법으로 뷰를 작성할 수 있다. 예를 들자면 아래와 같다.

class SomeView: View {
    var body: some View {
        VStack {
            Text("Line 1")
            Text("Line 2")
            Text("Line 3")
        }
    }
}

이 코드는 세 줄의 텍스트를 세로로 줄세운 형태의 뷰를 작성한다.

그런데 솔직히 문법만 봐서는 말도 안 되는 코드이기도 하다. body 가 반환해야 하는 타입은 some View 이지만 내부에는 명시적인 반환문도 없고 뷰 컴포넌트 인스턴스만 나열하고 있다.

물론 실제로는 이 뷰 컴포넌트들은 리스트 형태로 변환되어서 각자의 레이아웃 컴포넌트 혹은 View 인스턴스로 생성되어서 최종 반환된다. 단지 그 일을 하는 코드는 숨겨져 있을 뿐이다.

이런 방식의 코드를 이전에 비공식으로 Function Builders라는 이름으로 제공하고 있었다. 하지만 이 기능이 너무나 유용한(?) 나머지 이제 Result Builders라는 이름으로 좀 더 다듬어서 5.4 버전에서 공개되었다. 정확하게는 @resultBuilder 라는 속성이 추가되었다.

간단히 정리하자면 아래와 같은 코드다.

@resultBuilder
struct MultilineBuilder {
    static func buildBlock(_ components: String...) -> String {
        components.joined(separator: "\n")
    }
}

@resultBuilder 속성으로 정의된 경우 buildBlock(_ components: ...) 형태의 메서드를 반드시 구현해야 한다. 위의 코드의 경우 입력된 문자열의 가변 매개변수를 개행 문자를 사이에 끼워서 하나의 문자열로 만들어서 반환하는 간단한 코드다.

이렇게 만들어진 빌더는 타입에 속성으로 붙여줄 수 있다.

@MultilineBuilder func MyBody() -> String {
    "Line 1"
    "Line 2"
    "Line 3"
}

예상 가능하겠지만 위 MyBody() 함수의 호출 결과는 아래와 같다.

Line 1\nLine2\nLine 3

함수 뿐만이 아니라 프로퍼티도 당연히 가능하다.

@MultilineBuilder var body: String {
    "Line 1"
    "Line 2"
    "Line 3"
}

이렇게 하면 역시 body 프로퍼티 역시 앞의 예제와 동일한 값을 가지게 된다.

이런 식으로 Result Builders는 이런 특수한 멀티 라인의 이상한 문법의 코드를 개발자가 커스터마이징해서 편하게 코딩할 수 있도록 도와준다.

이 외에도 @resultBuilder 속성은 여러가지 추가 기능을 가지고 있다. 필요하다면 아래 링크에서 관련된 항목을 찾아보자.