Apple🍎/SwiftUI
-
SwiftUI 뷰 계층 형성의 모든 것Apple🍎/SwiftUI 2025. 5. 25. 16:02
SwiftUI를 처음 접하면서 가장 직관적이면서도 헷갈리는 부분 중 하나는 뷰가 어떻게 구성되고 계층이 형성되는지입니다. 겉보기에는 단순해 보이는 코드가 실제로는 복잡한 뷰 계층 구조를 만들어내는 마법 같은 일이 일어나죠. 오늘은 이 마법의 비밀을 함수형 빌더 패턴부터 차근차근 풀어보겠습니다.함수형 빌더 패턴이란 무엇인가?SwiftUI의 뷰 계층을 이해하기 위해서는 먼저 함수형 빌더 패턴(Functional Builder Pattern)을 이해해야 합니다. 이 패턴은 객체지향 프로그래밍에서 사용하는 빌더 패턴과는 근본적으로 다른 접근 방식입니다.전통적인 빌더 패턴 vs 함수형 빌더 패턴먼저 전통적인 빌더 패턴이 어떻게 작동하는지 살펴보겠습니다.// 전통적인 빌더 패턴 (객체지향적 접근)class UIVi..
-
SwiftUI의 View 생명주기와 상태 관리: iOS와 macOS의 차이점 상세 분석Apple🍎/SwiftUI 2025. 4. 10. 21:05
문제 상황SwiftUI로 멀티 플렛폼 앱을 개발하면서 다음과 같은 이상한 현상을 경험했습니다.ActivityDetailView에서 활동 데이터를 편집했습니다.편집한 데이터는 데이터베이스에 성공적으로 저장되었습니다.편집 모드에서 보기 모드로 돌아간 후iOS에서는 편집된 최신 데이터가 화면에 표시됩니다.macOS에서는 편집 전의 원래 데이터가 화면에 표시됩니다.같은 코드를 실행했는데도 플랫폼에 따라 다른 결과가 나왔습니다. 데이터베이스에는 제대로 저장되었으나, macOS에서는 UI에 반영되지 않았습니다.플렛폼 별 차이가 생긴 이유NavigationStack(path: $path) { HomeView(viewModel: viewModel, path: $path) .navigationTitle..
-
SwiftUI : List 업데이트가 안됨 ( Swift 랜더링 최적화 과정 )Apple🍎/SwiftUI 2025. 4. 9. 18:05
"왜 안 바뀌는 거야?" 메인 화면인 HomeView에서는 활동 목록이 쭉 나오고, 거기서 특정 활동을 선택하면 DetailView로 이동해 상세 정보를 보고 편집할 수 있었습니다. 문제는 DetailView에서 활동 정보를 수정하고 저장한 다음에 HomeView로 돌아왔을 때 발생했어요. 분명히 CoreData를 통해 뷰 모델에는 데이터 변경 사항이 반영됐는데, 화면의 리스트는 업데이트 되지 않고 이전 상태를 계속 가지고 있더라고요. 코드는 이런 식이었어요// 데이터 변경 후viewModel.loadData() // 새로운 데이터를 불러오는 함수분명히 데이터를 새로 불러와서 @Published var todayActivities: [Activity] = []에 새 배열을 할당했는데도 말이죠. 로그를..
-
SwiftUI 멀티 플렛폼 Navigation 아키텍쳐 설계 (Coordinator 야 저리 가라)Apple🍎/SwiftUI 2025. 4. 8. 17:23
UIKit에서 Coordinator 패턴이 등장한 배경UIKit 개발에서 Coordinator 패턴은 앱의 화면 전환 흐름을 관리하는 문제를 해결하기 위해 등장했습니다. 이 패턴이 필요했던 주요 이유들은 다음과 같습니다.1. 뷰 컨트롤러의 과도한 책임 분산UIKit의 기본 구조에서는 화면 전환 로직이 주로 뷰 컨트롤러 내부에 위치했습니다.class ProfileViewController: UIViewController { func showSettings() { let settingsVC = SettingsViewController() settingsVC.user = self.user self.navigationController?.pushViewControlle..
-
[Issue] SwiftUI: Canvas 컴포넌트가 onAppear로 인한 @State 값 변경을 업데이트 하지 않음Apple🍎/SwiftUI 2025. 3. 24. 19:34
문제 상황최근 SwiftUI로 모래 시뮬레이션 앱을 개발하던 중 이상한 문제를 발견했습니다. 간단히 말해, Canvas를 사용해 그리드와 모래를 그리고 @State 변수를 통해 모래의 위치를 관리하는 상황이었습니다. struct ContentView: View { let columns = 40 let rows = 40 let cellSize: CGFloat = 10 // Grid의 각 cell의 상태 값 : 0 = empty, 1 = sand @State private var grid = Array(repeating: Array(repeating: 0, count: 40), count: 40) var body: some View { VStack ..
-
List와 ScrollView+LazyVStack 비교하기Apple🍎/SwiftUI 2025. 3. 7. 00:04
List + TextEditor 리스트 내부 셀 안의 텍스트에디터에 내용이 많아지면 내부 스크롤이 활성화됨 ( 텍스트 에디터 크기도 살짝 늘어남 )ScrollView + LazyVStack + TextEditorLazyVstack 셀 안의 텍스트 에디터에 내용 있는 많아지면 그에 맞춰 텍스터 에디터 크기가 증가함 SwiftUI에서 List와 ScrollView+LazyVStack 조합이 TextEditor와 함께 작동할 때 다른 동작을 보이는 이유가 뭘까요?List와 ScrollView+LazyVStack의 기본적인 차이점List의 동작 방식List는 UITableView를 기반으로 한 컴포넌트로, 고정된 셀 높이나 자동 계산된 높이를 사용합니다. List는 내부적으로 콘텐츠의 크기를 미리 결정하고,..
-
SwiftUI 데이터 모델에 actor를 사용하면 안되는 이유Apple🍎/SwiftUI 2025. 2. 19. 22:44
Swift Actor 기본 개념Actor는 독립적인 실행 컨텍스트를 가지고 있으며, 이 컨텍스트 안의 데이터는 자동으로 동기화되어 안전하게 관리됩니다. 여러 작업(Task)이 동시에 Actor에 접근하려고 할때, 시스템은 이를 알아서 순차적으로 처리합니다. 마치 줄을 서서 차례를 기다리듯이, 한 번에 하나의 작업(Task)만 Actor의 데이터에 접근할 수 있게 되어 데이터 경장상태(race condition)을 효과적으로 예방할 수 있습니다. actor ChatRepository { private var messages: [Message] = [] func addMessage(_ message: Message) { messages.append(message) } ..
-
클린 아키텍처 쉽게 이해하기 with SwiftUI 🔍Apple🍎/SwiftUI 2024. 10. 29. 23:06
클린 아키텍처가 뭔가요?앱을 만들 때 코드를 역할별로 깔끔하게 나누는 방법이에요. 마치 서랍장에 물건을 종류별로 정리하는 것처럼, 코드도 하는 일에 따라 구분해서 관리하는 거죠.클린 아키텍처의 계층 구조 이해하기 📚계층이란? 🤔앱의 코드를 역할별로 나눈 각각의 층을 말해요. 각 계층은 자기만의 역할이 있고, 다른 계층과 약속된 방식으로만 소통해요. Domain Layer (핵심 계층) 💡앱의 가장 기본이 되는 부분이에요. 마치 집을 지을 때 기초 공사가 중요한 것처럼, Domain Layer는 앱의 핵심적인 데이터 모델과 이를 다루는 규칙들을 담고 있답니다.Entity: 실제 세상의 물건이나 개념을 앱 속에서 어떻게 표현할지 정하는 설계도예요.예를 들어 쇼핑앱을 만든다고 생각해볼까요?실제 상품을 앱..