Skip to content
Merged
23 changes: 23 additions & 0 deletions practice/HIGPractice/HIGPractice.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,26 @@
/* End PBXFileReference section */

/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
4D26A0013B16AA1100B7A001 /* Exceptions for "HIGPractice" folder in "HIGPractice" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Learning/LEARNING_LOG.md,
"Learning/Phase-01-AppFrameworks/ActivityKit/ActivityKit.md",
"Learning/Phase-01-AppFrameworks/AppIntents/AppIntents.md",
"Learning/Phase-01-AppFrameworks/Observation/ISSUE_DRAFT.md",
"Learning/Phase-01-AppFrameworks/Observation/Observation.md",
"Learning/Phase-01-AppFrameworks/Phase-01-AppFrameworks.md",
"Learning/Phase-01-AppFrameworks/SwiftData/ISSUE_DRAFT.md",
"Learning/Phase-01-AppFrameworks/SwiftData/SwiftData.md",
"Learning/Phase-01-AppFrameworks/SwiftUI/SwiftUI.md",
"Learning/Phase-01-AppFrameworks/WidgetKit/WidgetKit.md",
"Learning/Phase-02-AppServices/Phase-02-AppServices.md",
"Learning/Phase-03-GraphicsMedia/Phase-03-GraphicsMedia.md",
"Learning/Phase-04-SystemNetwork/Phase-04-SystemNetwork.md",
"Learning/Phase-05-iOS26/Phase-05-iOS26.md",
);
target = 5DCF8F3A2F4BE4D5008EA555 /* HIGPractice */;
};
5DCF91002F4D8400008EA555 /* Exceptions for "HIGPracticeWidget" folder in "HIGPracticeWidgetExtension" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Expand All @@ -72,6 +92,9 @@
/* Begin PBXFileSystemSynchronizedRootGroup section */
5DCF8F3D2F4BE4D5008EA555 /* HIGPractice */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
4D26A0013B16AA1100B7A001 /* Exceptions for "HIGPractice" folder in "HIGPractice" target */,
);
path = HIGPractice;
sourceTree = "<group>";
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ enum PracticeCatalog {
makeItem(id: "appintents", name: "App Intents", description: "Siri/Shortcuts 액션 노출", phase: .appFrameworks, symbolName: "waveform.badge.mic", tint: .pink, completed: false, blogSlug: "appintents", docsSlug: "appintents", tutorialPath: "tutorials/appintents", samplePath: "samples/SiriTodo", aiDoc: "appintents.md"),
makeItem(id: "swiftui", name: "SwiftUI", description: "선언형 UI 설계와 데이터 흐름", phase: .appFrameworks, symbolName: "rectangle.3.group.bubble.left.fill", tint: .indigo, completed: true, blogSlug: "swiftui", docsSlug: "swiftui", tutorialPath: "tutorials/swiftui", samplePath: "samples/TaskMaster", aiDoc: "swiftui.md"),
makeItem(id: "swiftdata", name: "SwiftData", description: "@Model 기반 로컬 데이터 영속화", phase: .appFrameworks, symbolName: "externaldrive.fill.badge.icloud", tint: .teal, completed: false, blogSlug: "swiftdata", docsSlug: "swiftdata", tutorialPath: "tutorials/swiftdata", samplePath: "samples/TaskMaster", aiDoc: "swiftdata.md"),
makeItem(id: "observation", name: "Observation", description: "@Observable 상태 관리", phase: .appFrameworks, symbolName: "eye.fill", tint: .mint, completed: false, blogSlug: "observation", docsSlug: "observation", tutorialPath: "tutorials/observation", samplePath: "samples/TaskMaster", aiDoc: "swiftui-observation.md"),
makeItem(id: "observation", name: "Observation", description: "@Observable 상태 관리", phase: .appFrameworks, symbolName: "eye.fill", tint: .mint, completed: true, blogSlug: "observation", docsSlug: "observation", tutorialPath: "tutorials/observation", samplePath: "samples/CartFlow", aiDoc: "swiftui-observation.md"),
makeItem(id: "foundationmodels", name: "Foundation Models", description: "온디바이스 LLM 앱 설계", phase: .appFrameworks, symbolName: "brain.head.profile", tint: .cyan, completed: false, blogSlug: "foundationmodels", docsSlug: "foundationmodels", tutorialPath: "tutorials/foundationmodels", samplePath: "samples/AIChatbot", aiDoc: "foundation-models.md"),
makeItem(id: "tipkit", name: "TipKit", description: "맥락형 힌트/온보딩 UX", phase: .appFrameworks, symbolName: "lightbulb.max.fill", tint: .teal, completed: false, blogSlug: "tipkit", docsSlug: "tipkit", tutorialPath: "tutorials/tipkit", samplePath: "samples/TipShowcase", aiDoc: "tipkit.md"),

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ struct PracticeHomeView: View {
private func destination(for item: FrameworkItem) -> some View {
if item.id == "appintents" {
SiriTodoSampleRootView()
} else if item.id == "observation" {
CartRootView()
} else if item.id == "swiftui" {
TaskMasterRootView()
} else {
Expand Down
1 change: 1 addition & 0 deletions practice/HIGPractice/HIGPractice/Learning/LEARNING_LOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ For each completed scope, append one row:
| 2026-03-10 | Phase 1 | App Intents | SiriTodo sample adaptation, intents, shortcuts, concurrency troubleshooting | #16 | #18 | - | Reframed a standalone sample into an in-app learning flow, clarified `nonisolated` vs `MainActor.run`, and reduced App Shortcut registration to a valid minimal set. |
| 2026-03-12 | Phase 1 | SwiftUI | TaskMaster scaffold, shared layer, navigation hookup, concept notes | #20 | #22 | - | Reframed a standalone sample app into a navigable in-app demo and clarified `some View`, accessibility, `ContentUnavailableView`, and `static ModelContainer` responsibilities. |
| 2026-03-13 | Phase 1 | SwiftData | TaskMaster data flow review, CRUD path tracing, service/query notes | #23 | - | - | Clarified how `@Model`, `ModelContainer`, `@Query`, `@Bindable`, `FetchDescriptor`, and relationships connect storage changes to SwiftUI updates. |
| 2026-03-17 | Phase 1 | Observation | CartFlow Views 구현 및 Apple Pay 결제 흐름 UI 정리 | #26 | #27 | - | Connected `@Observable` store reads to actual SwiftUI screens, and clarified where `@Environment`, `@Bindable`, and local `@State` each own or project state. |

## Weekly Reflection (Optional)

Expand Down
Loading
Loading