[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🍎 Apple 97

[SwiftData] ModelContainer, ModelContext

본 게시글은 WWDC 2023의 Dive deeper into SwiftData 세션의 내용을 정리한 것입니다. https://developer.apple.com/videos/play/wwdc2023/10196 @Model 을 통해 생성된 모델은 ModelContainer에 의해 실질적 스키마로서 동작하게 되며, 이를 기반으로 영구 저장 데이터가 생성되게 된다. 코드에서 Model 클래스의 인스턴스로 작업을 하게되면 해당 인스턴스는 메모리에서 해당 상태를 추적하고 관리하는 ModelContext에 연결된다. ModelContainer 스키마와 영구 저장 데이터간의 bridge 역할을 한다. 객체가 메모리에 저장될지, 디스크에 저장될지 등 객체의 저장 방식에 대한 설명이 포함된다. Versioning, M..

[SwiftData] Migration과 버전관리

본 게시글은 WWDC 2023의 Model your schema with SwiftData 세션의 내용을 정리한 것입니다. https://developer.apple.com/videos/play/wwdc2023/10195 Modeling 복습 SwiftData를 Import하고 class에 @Model 매크로를 부여하는 것으로 스키마를 생성할 수 있다. @Attribute(.unique) 매크로를 통해 특정 속성을 유니크하게 만들 수 있다. 만약 이미 존재하는 프로퍼티를 Insert하려 하면 기존에 존재하던 데이터를 업데이트한다. (upsert) 기존에 존재하던 속성의 이름을 그냥 바꾸면 단순히 새로운 속성만 생성되고 이전 속성의 데이터는 모두 삭제된다. 이름을 바꾸고 기존의 데이터를 보유하기 위해서는 ..

[SwiftData] Meet SwiftData

https://developer.apple.com/videos/play/wwdc2023/10187/?time=463 해당 게시글은 WWDC 2023의 Meet SwiftData 세션을 글로 정리한 것입니다. Meet SwiftData SwiftData는 Swift의 Macro 시스템을 적극 활용중이며 SwiftUI는 물론이고 CloudKit, Widget과도 자연스럽게 통합됨. 해당 세션에서는 다음 세가지를 설명함. @Model 매크로를 통해 Swift 코드 내에서 모델을 직접 만드는 방법 내 데이터를 fetch하고 modify하는 방법 SwiftUI와 어떻게 원활하게 작동하는지에 대한 개요 Using the model macro @Model는 Swift Code 내에서 Model Schema를 정의할 ..

[Swift] Attributes

Attributes 선언 혹은 타입에 새로운 정보를 추가하는 역할을 수행한다. 예를 들면 discardableResult 는 함수의 선언부에 사용되어서, 해당하는 함수의 리턴값을 사용부에서 사용하지 않아도 에러를 띄우지 않도록 컴파일러에게 알려주는 역할을 한다. @ 심볼을 통해 attribute를 확인할 수 있으며 심볼 뒤에는 그 attribute의 이름이 따라온다. 추가적인 정보가 필요할 경우 해당 attribute의 arguments도 뒤에 붙는다. @ @() 종류 attached macro도 Attributes 버전 제한둘때 쓰는 available 도 Attribute @available(iOS 10.0, macOS 10.12, *) discardableResult, dynamicCallable 등..

🍎 Apple/Swift 2023.07.29

[SwiftData] 기본설명 및 특징

https://developer.apple.com/xcode/swiftdata/ SwiftData 선언적 코드로 데이터를 쉽게 관리해주는 도구. Swift 코드를 통해 안정적으로 쿼리 요청을 보내고 필터링할 수 있다. SwiftUI와의 연동성도 좋다. 모델생성 용이 모델도 @Model 어트리뷰트만 붙여주면 추가적인 파일이나 도구없이 관리가 가능하다. 또한 제약조건도 @Attribute(.unique) 와 같은 방식으로 간단하게 선언할 수 있다.당연히 Relationship 설정도 가능하다. @Model class Recipe { @Attribute(.unique) var name: String var summary: String? var ingredients: [Ingredient] } SwiftData..

[Xcode][문서의역] Stepping through code and inspecting variables to isolate bugs

디버깅 기초를 다시 잡으려고 문서를 읽었습니다. 애플에서 제공한 Stepping through code and inspecting variables to isolate bugs 문서를 의역했고, 그 외 기본적으로 필요한 Breakpoint에 대한 정보를 작성하기 위해 Setting breakpoints to pause your running app 문서의 내용도 조금 가져왔습니다. (Breakpoint는 간단하게 정리만 했습니다.) https://developer.apple.com/documentation/xcode/setting-breakpoints-to-pause-your-running-app https://developer.apple.com/documentation/xcode/stepping-thr..

🍎 Apple/Xcode 2023.07.15

[Swift] AVFoundation 기초

최근에 AVFoundation을 알아야 할 일이 있어서 공부를 좀 했습니다. 본 포스트는 애플 공식 문서의 의역을 대다수 포함합니다. AVFoundation 시청각 asset들로 작업하고, 장치 카메라를 제어하고, 오디오를 처리하고, 시스템 오디오 상호 작용을 구성할 수 있습니다. AVFoundation은 Apple 플랫폼에서 미디어를 검사, 재생, 캡처 및 처리는 등 광범위한 작업을 포괄하는 몇 가지 주요 기술 영역을 포괄하고 있습니다. UIKit 너머의 Core 프레임워크와 맞닿아 있는 프레임워크입니다. AVAsset https://developer.apple.com/documentation/avfoundation/avasset/ 시간이 지정된 시청각 미디어를 모델링하는 객체 해당 객체는 파일 기반의..

🍎 Apple/Swift 2023.07.15

[Swift][문서의역] Macro

본 포스트는 스위프트 공식문서의 매크로에 대한 설명을 의역한 것이며 편의를 위해 생략 혹은 추가된 내용이 있을 수 있습니다. Macro https://docs.swift.org/swift-book/documentation/the-swift-programming-language/macros 컴파일 타임에 코드를 만들 수 있는 기능 Macro는 컴파일할 때 소스코드를 변환해서 반복적인 코드를 최소화할 수 있도록 돕는다 컴파일시간에 Swift는 코드를 빌드하기 전에, 코드 안에 존재하는 모든 매크로를 확장(Expands)한다. 매크로의 특징 매크로의 코드 확장 작업은 추가적인 작업으로, 기존 코드를 수정하거나 삭제하지는 않는다. 매크로 코드와 매크로 확장 결과 코드 모두에서 유효한 Swift 코드 여부를 확인..

🍎 Apple/Swift 2023.07.15

[Swift] Mirror

Mirror Mirror란 reflection은 일반적인 프로그래밍 기능 중 하나로, 런타임에 동적으로 멤버를 검사하고 작업할 수 있습니다. 원래는 Swift같이 정적으로 타입을 지정하는 언어에는 사용하지 않지만 Swift2부터 지원이 추가되었습니다. Swift에서 reflection을 사용하면 struct, class 혹은 기타 타입에 관련없이 타입에 있는 stored property의 값을 읽을 수 있습니다. reflection을 사용하기 위해 필요한 객체가 Mirror입니다. Mirror는 인스턴스의 저장 property, collection 혹은 tuple의 요소 등에 대해 특정 인스턴스를 구성하는 부분을 설명합니다. Mirror는 어떻게 Mirror가 렌더링될지 지정하는 "display styl..

🍎 Apple/Swift 2023.05.18

[Concurrency] Actor

Task 복습 Task는 block 내부를 비동기적으로 실행해준다. print("\\(Thread.current)") Task { print("\\(Thread.current)") } print("\\(Thread.current)") // {number = 1, name = main} // {number = 6, name = (null)}// {number = 1, name = main} 그런만큼 각 Task는 독립적인 동작을 수행한다. 만약 참조타입의 값을 공유할 경우, 데이터에 동시적으로 접근하는 Data Race가 발생할 수 있다. 다만 무조건으로 동시성을 보장하는 것은 아닌데, 부모의 Context를 물려받는 경우 Task를 열어 비동기 컨텍스트를 만들어도 같은 스레드에서 실행될 수 있기 때문이다..