@iOS17; #SwiftMacro; 아직도 반복하니?

WWDC2023에서 발표한 SwiftMacro에 대해서 무엇이 있고, 어떤것인지 소개합니다!

육찬심
DelightRoom
6 min readNov 20, 2023

--

WWDC2023.. 애플의 Vision Pro를 제외하고는 큰 기대 없이 컨퍼런스를 시청하게 되는데….

⁉️😮 기대와 다르게 WWDC2023에서 iOS 및 Swift 관련하여 굉장히 흥미로운 것들을 많이 발표하였어요. 그 중 SwiftMacro에 대해서 유용하게 사용할만한 것만 간단히 소개해드리려고해요!
(Expression Macros와 Attached Macros 중 유용한것!)

먼저 Macro라는 단어는 우리에게 굉장히 친숙 한데요. 잠깐 정의를 보면..

#GPT

반복적인 작업을 더 빠르게 수행할 수 있도록 하는것으로 요약할 수 있겠네요!

iOS개발자도 swift로 코드를 작성하다보면 보일러플레이트 코드를 많이 볼 수 있어요.(우리는 중복을 싫어하지만 문법적인것은 피해갈 수 없죠🥲)
SwiftMacro를 이용하면 우리는 어떤 반복적인 작업을 쉽게 할 수 있을까요 ?

@Observable

SwiftUI로 UI코드를 작성할 때 Combine의 ObservableObject를 구현하게되면 우리는 아래와 같이 코드를 작성하게 됩니다.

class Object: ObservableObject {

@Published var title: String
@Published var subtitle: String
@Published var count: Int
...
}

ObservableObject 프로토콜을 구현하고 Property 마다 한땀한땀 @Published를 붙혀주는 지루하고 반복적인 작업..
@Observable 을 사용한한다면?

@Observable
class Object {

var title: String
var subtitle: String
var count: Int
...
}

프로퍼티 타입에 ValueType과 ReferenceType 모두 지원된다고 하네요!

@CaseDetection

Enum의 Case 타입 체크를 하기 위해 우리는 다음과 같은 코드를 작성할 때가 많이 있겠..죠?(저는 없었는데.. 애플이 만든 이유가 있을거라고 생각해요!)

enum Path {

case relative(String)
case absolute(String)
}

let absPaths = paths.filter { $0.isAbsolute }

extension Path {

var isAbsolute: Bool {
if case .absolute = self { true }
else { false }



extension Path {

var isRelative: Bool {
if case relative = self { true }
else { false }
}

위의 Enum타입에 Case가 하나 추가될 때마다 isAbsolute와 같은 소스코드가 계속 추가되어야 한다는 단점이 있는데요.
@CaseDetection 을 이용한다면 ?

@CaseDetection
enum Path {

case relative(String)
case absolute(String)

// 아래는 매크로에 의해 자동 생생된 코드(옵션을 통해 볼 수 있음)
var isAbsolute: Bool {
if case .absolute = self { true }
else { false }
}

var isRelative: Bool {
if case . relative = self { true }
else { false }
}
}

매크로를 사용하여 번거롭게 Case가 추가될 때마다 새로운 소스코드를 작성할 필요가 없어졌네요!

#Preview

Xcode15부터는 기본적으로 SwiftUI 파일을 생성하면 #Preview를 이용한 파일이 자동으로 생성되는것을 알 수 있어요!


struct ContentView_Previews: PreviewProvider {

static var previews: some View {
ContentView()
}
}

// Xcode15 이상에서 작성되는 SwiftUI Preview 코드
#Preview {
ContentView()
}

#Preview는 SwiftUI 뿐 만 아니라 UIKit 도 지원된다는것! 최소 지원버전이 iOS 13 이상이면 사용 가능해요.

Expand Macro

SwiftMacro를 이용하면 기본적으로 자동으로 생성되는 코드가 감춰져있어요! 이를 보기 위해서는 아래와 같은 옵션을 통해 보실 수 있어요.

Expand Macro를 통해 표시된 코드는 디버깅도 가능하다

지금까지 @Observable, @CaseDetection, #Preview 등에 대해서 사용방법을 알아보았는데요.

이외에도 많은 매크로가 있어요!
SwiftData에서 사용되는
@Model
@Attribute(.unique)
@Transient
#Predicate
등 커스텀 매크로도 가능하다는것!

#Preview를 제외하면 모두 iOS 17 이상만 사용이 가능해요 😭
앞으로도 많은 매크로가 추가될거 같네요 😁

자세한 사항은 아래의 swift-evolution 문서를 이용해주세요!

Apple이 매크로 기능을 추가하면서 많은 최적화도 같이 작업해서 성능이 많이 좋아졌다고 합니다.
회사의 프로젝트에는 매크로를 사용하려면 대략 2~3년정도 기다려야겠네요.
사용할 수 있는 그날까지 모두 화..이..팅!

작성자 : Saeroi — iOS Developer DelightRoom

⏰ 딜라이트룸에서 알라미와 함께 아침을 바꿀 분들을 모십니다

https://team.alar.my/recruit/?utm_campaign=branding&utm_source=medium&utm_content=banner

🙌딜라이트룸의 다양한 채널들을 팔로우하고 빠르게 소식을 받아보세요!

--

--