SwiftUI
-
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 ..
-
Metal 둘러보기Apple🍎/Metal 2025. 3. 21. 22:37
셰이더(shader)는 무엇인가?다음은 애플 디벨로퍼 홈페이지에 있는 Metal 의 소개입니다. 일단 Metal 을 사용하면 GPU 프로그래밍을 가능하게 해준다고는 들었는데, 셰이딩 언어는 또 뭘까요? 사실 GPU(Graphics Processing Unit)는 그people-analysis.tistory.comMetal에 대해 알아보기전에 그래픽 렌더링과 GPU의 발전 역사를 먼저 살펴보시면 다음에 나올 용어들에 익숙해져 내용 이해에 도움이 됩니다. 소개애플의 Metal 프레임워크는 iOS, macOS, tvOS 기기에서 GPU를 직접 제어할 수 있는 저수준 그래픽 API입니다. 2014년에 처음 소개된 이후, Metal은 애플 플랫폼에서 OpenGL을 대체하며 최신 그래픽 및 컴퓨팅 작업을 위한 핵심..
-
SwiftUI View 안에서 직접 발행, 구독 관리 방법Apple🍎/Combine 2025. 3. 13. 20:47
배경 최근에 SwiftData를 사용해서 프로젝트를 진행하였는데요. 데이터의 읽을 때는 @Query를 사용하면 SwiftUI 뷰 라이프 사이클에 맞춰 알아서 조회를 해주고 변경사항이 생기면 알아서 변경사항을 감지했다가 이를 db에 반영해 주니뷰에 보여줄 정보를 관리하기 위한 별도의 viewModel 계층이 굳이 필요 없겠다는 생각이 들었습니다. 너무 과도한 계층 분리의 쓸모에 대해 생각하던 와중이었기 때문에 "아예 ViewModel을 두지 않고 View에서 모든 걸 처리하자"를 콘셉트로 프로젝트를 진행하였습니다. 문제 상황특정 프로퍼티를 변경을 감지하는 로직이 필요했기 때문에 Combine을 이용해 발행자와 onChange를 조합하여 사용하려고 했습니다. 따라서 발행자와 구독 관리가 필요해졌는데 평소 같..