본문 바로가기
Apple🍎/WWDC 2023

[WWDC 2023] (6) 스위프트의 새로운 기능 - 2

by 텅빈비니 2023. 9. 8.
반응형

안녕하세요🐶

빈지식 채우기의 비니🙋🏻‍♂️입니다.

 

오늘의 포스팅은 WWDC 2023의 여섯 번째 - 스위프트의 새로운 기능 - 2 에 대해 알아보도록 하겠습니다.

- Swift Macro

이전 포스팅 Swift Macro에 대해 보고 오시면 이해하는데 도움이 될 수 있습니다👍🏻

 

[WWDC 2023] (4) Swift Macro

안녕하세요🐶 빈지식 채우기의 비니🙋🏻‍♂️입니다. 오늘의 포스팅은 WWDC 2023의 네 번째 - Swift Macro에 대해 알아보도록 하겠습니다. 1. 매크로의 예시 Swift 5.9 에 도입하였다. 반복적인 코드

beanistory.tistory.com

 

1. Swift Macro 기능

Swift Macro

  • 라이브러리 작성자에게 새로운 도구를 제공하여 매크로 시스템을 통한 표현적 API 설계를 지원한다.
  • 언어 자체의 능력을 확장하고 *일러플레이트 적 코드를 제거하고 Swift 포현력을 이용할 수 있다.

*보일러 플레이트 : 최소한의 변경으로 반복적으로 사용되는 코드. '묻지도 따지지도 않고 따라 적는 코드'

 

그러면 어떻게 매크로를 사용하여 보일러 플레이트 코드를 줄일 수 있나요?

보일러 플레이트적 코드

  • isAbsolute, isRelative 같은 Check 기능을 사용하기 위해서는 위와 같이 별도의 기능 정의가 필요합니다.
  • 별도의 정의가 필요하기 때문에 이것을 우리는 보일러 플레이트적 코드라 부를 수 있습니다.
  • 하지만 매크로를 사용하면 아래와 같이 표현할 수 있습니다.

매크로 사용(1)
매크로 사용(2)

  • @CaseDetection을 사용하여 별도의 구현 없이 Check 기능을 사용할 수 있습니다.

 

assert(max(a, b) == c)
  • Assert 함수는 조건이 참인지 아닌지 확인한다.
  • 조건이 거짓이면 프로그램은 중지하지만, 정확히 어떤 에러인지 확인하기 어렵다.
    • 로그를 추가하거나 디버거를 통해 확인할 수 있다.

Assert의 확장

  • Assert 라는 매크로를 확장하여 #assert 로 생성한다.
  • a,b,c 에 어떤 값이 들어갔고 왜 조건이 거짓으로 나오는지도 확인할 수 있다.

매크로의 매개변수 타입체크

  • 기본적으로 매크로는 매개변수에 대한 타입 체크가 실행된다.
    • 예를 들어, 최댓값을 다른 값과 비교하는 것을 잊었다면 위 이미지와 같이 에러 메세지가 매크로로 확장되기 전에 즉시 출력됩니다.

외부 매크로

  • 매크로의 대부분은 외부 매크로로 정의되고 있고 String을 통해 매크로 적용의 모듈과 타입을 구체화 합니다.

 

2. Swift Macro 동작 원리

매크로 동작원리

  • 외부 매크로 타입은 별도의 프로그램에 적용되어 있으며 compiler plug-in으로 작동한다.
    1. Swift compiler가 소스코드를 전달 > 매크로의 사용을 플러그인에 보낸다.
    2. 플러그인이 새로운 소스 코드를 생산하면 다시 Swift Compiler에 통합한다.
  • 직접 보일러플레이트를 생성하지 않아도 매크로가 대신 기능을 수행해준다.

#freestading 매크로

  • assert 매크로는 해시 구문(#)을 사용하기 때문에 freestanding 매크로라고 불립니다.
  • 구문에서 직접 작동하여 새로운 코드를 생성합니다.
    • 값을 생성하는 곳이면 어디든지 사용할 수 있어서 Expression Macro 라고도 할 수 있다.

 

3. 매크로의 종류

매크로의 종류

@attahed(member) Type 또는 Extension에서 새로운 정의를 추가
*앞서 나온 @CaseDetection은 여기에 속함
@attahed(peer) 비동기 프로그래밍인 Completio Handler와 같은 기능으로 수행
@attahed(accessor) 접근자 매크로이며, Property와 같은 기능을 수행
@attahed(memberAttribute) Type 또는 Extension에 속성을 추가할 수 있는 기능을 수행
@attahed(conformance) Type 또는 Extension에 프로토콜과 같은 타입들을 준수하게끔 할 수 있는 기능을 수행

 

매크로 사용 전

  • SwiftUI에서 Observable의 기능을 사용하여 UI 를 업데이트를 하려고 합니다.
  • 그러기 위해서는 항상 ObservableObject를 준수하도록 하고 내부 프로퍼티들은 모두 @Published를 선언해야 합니다.
  • 다만 아래와 같이  매크로를 사용하면 깔끔하게 사용이 가능합니다.

매크로 사용 후

  • @Observable 매크로를 통해 깔끔하게 값의 변화를 관찰하고 UI를 업데이트 할 수 있습니다.

@Observable에 사용된 매크로

  • @Observable에 사용된 매크로는 위와 같이 3개의 종류가 사용되었습니다.
  • Xcode를 통해 해당 매크로가 어떻게 정의되어있고 확장되어 있는지 아래와 같이 확인할 수 있습니다.

매크로 확장

 

이상으로 [WWDC 2023] (6) 스위프트의 새로운 기능 - 2 포스팅을 마치겠습니다.
틀린 부분이나 궁금한 사항은 댓글 남겨주세요~


참고

반응형