Platforms State of the Union을 훝고 갑니다.
추후 각 세션 정리 예정입니다.
Swift
Swift Macros
Boilerplate 코드를 좀 더 깔끔하게 만들어 줄 수 있는 방법입니다.
위처럼 @가 붙은 attribute일 수도 있고, 독립적으로 #이 붙은 형태일 수도 있습니다.
이 #URL Macro는 URL을 초기화하여 언래핑시켜주는 코드인데, 해당 Macro에서 Expand Macro를 통해 확인이 됩니다.
그 뿐만 아니라 유효한 URL String인지도 컴파일 타임에 체크해주고, 올바른 코드를 작성할 수 있도록 커스텀 피드백을 할 수 있게 해줍니다.
fetchContent(_:completion:) 함수에 async/await을 사용하고 싶을 땐, 위처럼 @AddAsync 매크로를 붙여서 쉽게 작성할 수 있습니다.
Quick Help로 Macro 내용을 확인할 수 있고,
내부적으로 어떻게 동작하는지를 보고 싶을 땐, breakpoint를 걸고 비동기함수를 실행하면 에디터에서 해당코드를 확장해서 보여줍니다.
Swift와 C++간 상호운용성
중간 브릿징 레이어 없이 두 언어를 모두 사용, 컴파일러 플래그를 설정해서 클래스, 함수, 벡터와 같은 템플릿 전문화를 서로 공유하며 사용가능합니다.
SwiftUI
Swift Charts의 파이차트 지원 및 차트 선택,
새 Inspector API,
Mapkit 지원, Overlay, Look around 등이 추가되었지만,
애니메이션 개선에 중점을 두었습니다. 애니메이션을 처음으로 되돌리고, 중단시키고, 취소하는 등의 고급기능들이 있습니다.
duration, bounce 파라미터를 가진 spring 애니메이션은 사용자 제스춰의 속도를 자동으로 반영해서 자연스럽게 전환시켜줍니다.
SF Symbols도 SwiftUI에선 애니메이션 효과를 줄 수 있습니다.
그리고 Multi-part Animation의 경우 AnimationPhase라는 새 API를 이용해서 단 몇줄로 정교한 애니메이션을 줄 수 있게 되었습니다.
이제부터 SwiftUI와 Mapkit API는 키프레임을 지원하여 무엇이든 애니메이션할 수 있습니다!
특정시간에 여러 속성을 정의하고, 위처럼 중간중간에 카메라 pitch, heading, position 을 독립적으로 애니메이션처리를 할 수 있습니다.
Data Flow
위와 같이 사용하던 기존의 @Published 프로퍼티와 ObservableObject를
Swift의 새 Macro를 적용하여 이렇게 심플하게 사용이 가능해집니다!
위처럼 작성하면 모든 public 프로퍼티들은 자동으로 Published가 됩니다.
그리고 해당 @Observable 객체를 사용할 때 기존처럼 @ObservedObject 프로퍼티 래퍼를 사용할 필요없이,
이렇게 직접 참조하기만 해도 됩니다!
@Observable 매크로는 View에서 사용하는 특정 프로퍼티가 변경될 때 View의 Body가 re-evaluated됩니다. View에서 사용하지 않는 필드를 수정할 때는 invalidation이 전혀 발생하지 않습니다.
SwiftData
CoreData는 Objective-C를 기반으로 만들어져 Swift의 이점을 충분히 사용할 수가 없기 때문에
Swift에 맞춘 데이터모델링 및 관리를 위한 SwiftData 프레임워크가 만들어졌습니다.
외부 파일 포멧과 상관없이 코드에만 집중할 수 있게 만들어졌습니다. Swift의 새 Macro 시스템을 사용한 Streamlined API를 제공합니다.
위와 같이 Swift로 작성된 모델이 있을 때,
@Model Marcro를 붙여줄 수 있습니다.
이 한줄 코드를 붙여줌으로써 지속성 자동 활성화, iCloud 싱크, Undo, Redo, Spotlight 검색 등을 쓸 수 있게 됩니다.
고유값을 가지는 등 특정 속성을 붙이고 싶을 땐 위처럼 프로퍼티에 annotation을 붙여주면 됩니다.
Codable 프로토콜을 사용한 enum, struct도 SwiftData에서 사용할 수 있습니다.
위처럼 SwiftData에 사용할 모델에 @Model Macro를 달아주고,
앱 루트에서 SwiftData의 컨테이너를 설정하기 위한 modifier를 추가합니다.
그리고 사용할 View에서 modelContext를 @Environment로 주입하여 지속되도록 해줍니다.
마지막으로 데이터를 사용할 View에서 데이터를 연결하여 사용하면 됩니다.
이 때 새로운 @Query 프로퍼티 래퍼를 사용합니다. 저장된 데이터를 불러오기 때문에 프로토타입은 필요가 없습니다.
위젯도 같은 방식으로 SwiftData를 사용할 수 있습니다. Shared Container가 활성화 되었다면 SwiftData가 자동으로 동일한 API를 사용하여 위젯에서 같은 데이터에 직접 액세스할 수 있도록 합니다.
WidgetKit, IntentKit, TipKit, Airdrop
WidgetKit
iOS17용으로 업데이트하면 간단한 변경으로 Standby에서 위젯을 보여줄 수 있게 됩니다. 이 위젯은 iPad 잠금화면에서도 사용할 수 있고, MacOS Sonoma의 바탕화면용으로도 사용할 수 있게 됩니다.
그리고 위젯에서 상호작용을 지원합니다.
위젯의 코드는 컨텐츠 생성을 위해 비동기적으로 실행되고, 빌드된 SwiftUI의 View는 아카이브에 저장됩니다.
후에 위젯을 그리게 될 때, 아카이브를 불러오고 백그라운드에서 렌더링한 후 시스템UI의 일부로 표시됩니다.
사용자가 버튼을 탭하면 해당 Extension이 다시 실행되어 작업을 처리하고 다시 UI를 업데이트합니다.
이 아키텍쳐로 MacOS에서 iPhone의 위젯을 Mac에서 매끄럽게 표시해줍니다.
Continuity(위 아키텍쳐를 말하는 듯?) 덕분에 위젯 아카이브를 네트워크로 Mac에게 보내고 사용자 상호작용을 iPhone에서 처리하기 위해 다시 보낼 수 있게 되었습니다.
위젯을 백그라운드를 식별하고, WidgetKit에서 제공하는 기본값을 사용하도록 padding을 업데이트하기만 하면 됩니다.
SwiftUI의 스택 기반 레이아웃을 사용하면 시스템이 컨텍스트에 따라 위젯의 색상과 간격을 조정할 수 있습니다.
위젯에 SwiftUI 버튼이나 토글을 추가하여 상호 작용도 쉽게 채택할 수 있습니다. 이러한 컨트롤에서 앱 의도를 트리거하기 위한 새로운 지원은 필요에 따라 Extension을 시작합니다. 위젯의 콘텐츠가 업데이트되면 시스템은 Keynote의 Magic Move처럼 작동하는 전환 애니메이션을 트리거합니다. 이동된 요소는 새 위치로 이동하고 추가되거나 제거된 요소는 부드럽게 페이드 인/아웃됩니다.
컨테이너 백그라운드를 설정하고,
padding을 제거해서, iOS17 기본 위젯 패딩을 사용하도록 하면 됩니다.
#Preview 라는 Swift Macro를 사용하면 Preview에서 위젯을 타임라인으로 어떻게 변화하는지 전환 애니메이션까지 확인이 가능합니다.
trasition Modifier를 추가. Preview Canvas에서는 iPad 잠금화면 위젯, Standby 위젯일 때 어떻게 보여지는지 확인을 할 수 있습니다.
SwiftUI는 배경이 제거될 때 내 위젯이 어떻게 보이는지 사용자 정의할 수 있는 새로운 showsWidgetContainerBackground 변수를 제공합니다. 배경이 제거됐을 때 birdBath를 보여주는 모습.
App Intent
App Shortcut에 Intent를 래핑하면 Spotlight 결과에서 앱아이콘 옆에 대화식으로 보여줄 수 있습니다.
shortTitle, 이미지나 symbol, 그리고 앱의 info.plist에서 앱아이콘을 보완하는 배경색을 제공하면 됩니다.
App Shortcut은 업데이트된 Shortcut 앱에 표시되며, 여기서 사용자가 자동으로 실행되게 하거나 홈화면에 추가하거나, 직접 바로가기를 만드는데 사용할 수 있습니다.
TipKit
사용자가 특정 기능을 잘 알지 못할 것이 예상될 때 TipKit을 사용하면 적시에 적절한 기능에 대해 사용자에게 지능적으로 교육함으로써 이 문제를 해결하는 데 도움이 됩니다.
TipKit에는 사용자가 시스템 앱에서 보는 데 익숙한 것과 일치하는 템플릿이 포함되어 있으며 앱의 모양과 느낌에 맞게 쉽게 사용자 지정할 수 있습니다. 다른 장치에서 해당 Tip을 본 경우에 이미 본 팁을 다시 표시하지 않도록 빈도를 관리할 수도 있습니다.
AirDrop
iOS17에서는 공유시트를 통하지 않고도 AirDrop을 통해서 컨텐츠를 다른 디바이스로 전달할 수 있습니다.
SwiftUI에서 ShareLink를 통하거나, UIKit 뷰 컨트롤러에서 activityItemsConfiguration을 적용할 수 있습니다.
(이후 하드웨어, Vision Pro에 대한 내용은 생략합니다)