SwiftUI
-
SwiftUI 뷰 계층 형성의 모든 것Apple🍎/SwiftUI 2025. 5. 25. 16:02
SwiftUI를 처음 접하면서 가장 직관적이면서도 헷갈리는 부분 중 하나는 뷰가 어떻게 구성되고 계층이 형성되는지입니다. 겉보기에는 단순해 보이는 코드가 실제로는 복잡한 뷰 계층 구조를 만들어내는 마법 같은 일이 일어나죠. 오늘은 이 마법의 비밀을 함수형 빌더 패턴부터 차근차근 풀어보겠습니다.함수형 빌더 패턴이란 무엇인가?SwiftUI의 뷰 계층을 이해하기 위해서는 먼저 함수형 빌더 패턴(Functional Builder Pattern)을 이해해야 합니다. 이 패턴은 객체지향 프로그래밍에서 사용하는 빌더 패턴과는 근본적으로 다른 접근 방식입니다.전통적인 빌더 패턴 vs 함수형 빌더 패턴먼저 전통적인 빌더 패턴이 어떻게 작동하는지 살펴보겠습니다.// 전통적인 빌더 패턴 (객체지향적 접근)class UIVi..
-
DSL과 SwiftUI: 도메인 특화 언어의 이해와 활용Apple🍎/Swift 2025. 5. 24. 23:02
들어가며우리가 일상적으로 사용하는 프로그래밍 언어들은 대부분 범용적인 목적으로 설계되었습니다. Swift, Java, Python 같은 언어들은 웹 개발부터 모바일 앱, 데이터 분석까지 다양한 분야에서 활용할 수 있죠. 하지만 때로는 특정 분야에서 더 직관적이고 효율적으로 문제를 해결할 수 있는 전용 언어가 필요합니다. 이것이 바로 DSL(Domain Specific Language)의 개념입니다.SwiftUI는 이러한 DSL의 훌륭한 예시입니다. UI 구성이라는 특정 도메인에 특화되어 설계된 언어로, 개발자가 더 직관적이고 선언적인 방식으로 사용자 인터페이스를 구성할 수 있게 해줍니다. 이 글에서는 DSL의 기본 개념부터 시작해서 SwiftUI가 어떻게 DSL로 작동하는지, 그리고 이를 가능하게 하는 ..
-
SwiftUI의 View 재생성, ID 시스템, 그리고 View 계층 구조카테고리 없음 2025. 4. 11. 21:55
구조체는 불변으로 유지하되, 상태는 별도로 관리한다. View 구조체의 불변성과 재생성SwiftUI에서 모든 View는 구조체(struct)로 구현됩니다. 구조체는 Swift의 값 타입(value type)이므로 한번 생성되면 내부 속성을 변경할 수 없는 불변(immutable) 객체입니다.struct CounterView: View { @State private var count = 0 var body: some View { Button("Count: \(count)") { count += 1 } }}상태가 변경될 때(예: count가 증가할 때) SwiftUI는 body 속성만 다시 계산하는 것이 아니라, 완전히 새로운 Counter..
-
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..
-
cellular automata: 간단한 모래 시뮬레이터 만들기Apple🍎/Metal 2025. 3. 24. 21:18
지난 시간에는 간단한 규칙으로 복잡한 시스템을 모델링하는 cellular automata가 뭔지에 대해서 알아보았는데요. 이번에는 이러한 cellular automata 개념을 사용해 간단한 모래 시뮬레이터를 만들어보도록 하겠습니다. 1. 격자 그리기 일단 시뮬레이션할 모래의 무대가 될 격자를 먼저 그려보도록 하겠습니다. SwiftUI의 Canvas를 사용해서 각각의 픽셀이 10 * 10 사이즈인 40 * 40 크기의 격자를 만들어보겠습니다. 코드 더보기import SwiftUIstruct ContentView: View { /// Celluar automata를 구성하는 격자의 속성(수, 크기)를 상수로 정의 let columns = 40 let rows = 40 let cellS..
-
[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 ..