티스토리 뷰
Swift Macros에서는 Swift Error를 이용해 Custom Error 메시지를 노출시킬 수 있습니다.
이 내용도 앞서 1편~4편에서의 DictionaryStorage 를 계속 예시로 들고있는데요,,
간단히 말하면 DictionaryStorage매크로는 struct에 적용되어 init()과 var dictionary프로퍼티를 만들어줍니다.
근데 만약 enum에 매크로를 작성하게 되면, init에 var dictionary라는 저장프로퍼티를 넣을 수 없으니 컴파일 오류가 나겠죠?
물론 전개된걸 보고 유추를 하면 아..이건 enum에 쓸 수 없겠구나.. 하면서 유추를 할 수는 있겠지만 약간 혼란스러울수가 있겠죠,,
그래서 우리는 enum에 쓰면 이건 struct에만 쓸 수 있는 매크로야!!!!!! 같은 커스텀 에러를 내주고 싶은 상황입니다.
이렇게 말이죠!!!!
이거는 Swift의 기본 Error타입을 이용해서 아주 손쉽게 해줄 수 있습니다.
일단 이 전개식에서 에러를 내주면 되는데요,,
그전에, MemberMacro에서 구현해야 하는 expansion함수에서 각각의 parameter가 어떤 정보를 가져다주는지 알아봅시다.
- attribute: 실제 DictionaryStorage속성으로, 개발자가 매크로를 쓰려고 작성한 것
- declaration: 개발자가 macro를 첨부한 선언을 제공 (ex. 개발자가 만약에 struct에 매크로를 추가하면 매개변수로 StructDeclSyntax타입을, enum에 추가하면 EnumDeclSyntax타입을 줍니다.)
- context: 매크로 구현이 컴파일러랑 소통하길 원할 때 사용 (ex. 오류메시지, 경고메시지 발신 등)
일단 매크로를 첨부한 타입이 Struct가 아니면 Struct에만 사용해달라는 컴파일 에러를 내봅시다.
먼저 Error를 정의해줍니다.
enum MySwiftError: CustomStringConvertible, Error {
case notAStruct
var description: String {
switch self {
case .notAStruct:
return "@DictionaryStorage can only be applied to a struct"
}
}
}
그리고 declaration이라는 매개변수에서 타입에 대한 정보를 받아와야겠죠??
이런식으로 declaration에 대한 타입을 체크해줍니다!
위 코드에서는 declaration이 Struct면 다음 코드로, 아니면 else문으로 빠지게 됩니다.
else문에서 error를 throw해줍니다.
꼭 struct, enum이 아니더라도 내부 내용들을 더 가져오고 싶다면 Syntax확인 후 다시 까서 가져오면 됩니다.
Syntax확인하는 법은 다른글에서 ..ㅎ
더 자세한 오류는 Diagnotic타입 인스턴스를 쓰면 된다고 하네요
'iOS' 카테고리의 다른 글
[macOS] 코드에서 파인더 Finder 바로 열기 (1) | 2024.01.25 |
---|---|
[이슈] Xcode Test succeed되는데 실행이 안됨 (2) | 2024.01.11 |
[Swift Macros] 매크로 알아보기 (4) - 매크로 구현부 (WWDC 정리) (0) | 2023.12.14 |
[Swift Macros] 매크로 알아보기 (3) - attached macro roles (0) | 2023.12.14 |
[Swift Macros] 매크로 알아보기 (2) - Macro roles (매크로 역할), freestanding(독립형) 매크로 (1) | 2023.11.30 |