티스토리 뷰

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타입 인스턴스를 쓰면 된다고 하네요

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함