Skip to content

Commit 098492e

Browse files
committed
Todo 모델 관련 로직에 Repository 추가
1 parent 263e481 commit 098492e

File tree

4 files changed

+89
-62
lines changed

4 files changed

+89
-62
lines changed

Todo.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10+
6F8CF59F2B0D1357007E9281 /* TaskRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F8CF59E2B0D1357007E9281 /* TaskRepository.swift */; };
1011
6FA7B7C52B00C9750069602F /* CircleButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FA7B7C42B00C9750069602F /* CircleButton.swift */; };
1112
6FA7B7C92B00DB860069602F /* TaskAddView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FA7B7C82B00DB860069602F /* TaskAddView.swift */; };
1213
6FB415432B05032E006FD091 /* TaskEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FB415422B05032E006FD091 /* TaskEditView.swift */; };
@@ -33,6 +34,7 @@
3334
/* End PBXBuildFile section */
3435

3536
/* Begin PBXFileReference section */
37+
6F8CF59E2B0D1357007E9281 /* TaskRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskRepository.swift; sourceTree = "<group>"; };
3638
6FA7B7C42B00C9750069602F /* CircleButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircleButton.swift; sourceTree = "<group>"; };
3739
6FA7B7C82B00DB860069602F /* TaskAddView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskAddView.swift; sourceTree = "<group>"; };
3840
6FB415422B05032E006FD091 /* TaskEditView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskEditView.swift; sourceTree = "<group>"; };
@@ -185,6 +187,7 @@
185187
children = (
186188
6FF8073B2B02728400B2F956 /* TaskModel.swift */,
187189
6FF8073D2B0272D700B2F956 /* TaskManager.swift */,
190+
6F8CF59E2B0D1357007E9281 /* TaskRepository.swift */,
188191
);
189192
path = Model;
190193
sourceTree = "<group>";
@@ -269,6 +272,7 @@
269272
isa = PBXSourcesBuildPhase;
270273
buildActionMask = 2147483647;
271274
files = (
275+
6F8CF59F2B0D1357007E9281 /* TaskRepository.swift in Sources */,
272276
6FDD59C82B00A00600D7148D /* FavoriteView.swift in Sources */,
273277
6FDEABC12B08CC11006BBCBF /* Toast.swift in Sources */,
274278
6FDD59B92B009E9E00D7148D /* ContentView.swift in Sources */,

Todo/Model/TaskManager.swift

Lines changed: 7 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -8,81 +8,27 @@
88
import Foundation
99

1010

11-
protocol Manager {
12-
var tasks: [TaskModel] { get set }
13-
14-
func load()
15-
func save(task: TaskModel)
16-
func delete(task: TaskModel)
17-
func update(task: TaskModel)
18-
}
19-
2011
@Observable
2112
class TaskManager {
2213
var tasks: [TaskModel]
14+
var repo: any TaskRepository
2315

24-
init() {
16+
init(repo: any TaskRepository) {
2517
tasks = []
26-
load()
18+
tasks = repo.load()
19+
20+
self.repo = repo
2721
}
2822

2923
func getTaskIndexBy(task: TaskModel) -> Int {
3024
return tasks.firstIndex(where: { $0.id == task.id }) ?? -1
3125
}
32-
}
33-
34-
extension TaskManager: Manager {
35-
36-
func load() {
37-
let dummy = loadDummyTask()
38-
tasks.append(contentsOf: dummy)
39-
}
4026

4127
func save(task: TaskModel) {
42-
tasks.append(task)
28+
repo.save(task: task)
4329
}
4430

4531
func delete(task: TaskModel) {
46-
tasks.removeAll { task.id == $0.id }
32+
repo.delete(task: task)
4733
}
48-
49-
func update(task: TaskModel) {
50-
if let idx = tasks.firstIndex(where: { $0.id == task.id }) {
51-
tasks[idx] = task
52-
}
53-
}
54-
}
55-
56-
func loadDummyTask() -> [TaskModel] {
57-
let title = [
58-
"아름다운 날씨",
59-
"푸르른 하늘",
60-
"산뜻한 봄바람",
61-
"작은 꽃 피어남",
62-
"햇살 가득한 날",
63-
"달콤한 커피 향기",
64-
"좋은 일만 있기를",
65-
"함께하는 행복한 시간",
66-
"신나는 음악 소리",
67-
"평화로운 마음"
68-
]
69-
let descriptions = [
70-
"바다에서 바람이 솔솔 부는 날, 작은 섬에 한 소녀가 살았다.",
71-
"가로등이 갈고리처럼 숨어있는 어둠 속, 도시는 잠들어가고 있었다.",
72-
"숲 속에서 나무들이 자신의 얘기를 속삭이듯, 나뭇잎이 춤을 추었다.",
73-
"고요한 밤, 별들은 하늘에 흩어져 있었고, 하나의 별은 빛나고 있었다.",
74-
"길을 걷다가 발밑에 꽃잎이 흩날리며 나를 반겨주었다.",
75-
"눈이 내려오는 날, 동네 사람들은 눈싸움을 즐기며 웃고 있었다.",
76-
"어린 왕자는 노란 장미꽃을 만나러 행성을 여행하고 다녔다.",
77-
"작은 창가에 앉아 차 한 잔을 마시며, 비오는 날의 여유를 즐겼다.",
78-
"시간이 멈춘 듯한 순간, 모든 것이 고요해진 산책로 위에서 바라본 뷰는 환상적이었다.",
79-
"마법의 문이 열리고 그 안에는 놀라운 모험이 펼쳐져 있었다."
80-
]
81-
82-
var tasks: [TaskModel] = []
83-
for i in 0..<10 {
84-
tasks.append(TaskModel(task: title[i], description: descriptions[i]))
85-
}
86-
87-
return tasks
8834
}

Todo/Model/TaskRepository.swift

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
//
2+
// TaskRepository.swift
3+
// Todo
4+
//
5+
// Created by 상선 on 11/22/23.
6+
//
7+
8+
import Foundation
9+
10+
protocol TaskRepository {
11+
// associatedtype Model: Identifiable
12+
var tasks: [TaskModel] { get }
13+
14+
func load() -> [TaskModel]
15+
func save(task: TaskModel)
16+
func delete(task: TaskModel)
17+
func update(task: TaskModel)
18+
}
19+
20+
class MemoryTaskRepository: TaskRepository {
21+
// typealias Model = TaskModel
22+
private(set) var tasks: [TaskModel] = []
23+
24+
func load() -> [TaskModel] {
25+
let dummy = loadDummyTask()
26+
return dummy
27+
}
28+
29+
func save(task: TaskModel) {
30+
tasks.append(task)
31+
}
32+
33+
func delete(task: TaskModel) {
34+
tasks.removeAll { task.id == $0.id }
35+
}
36+
37+
func update(task: TaskModel) {
38+
if let idx = tasks.firstIndex(where: { $0.id == task.id }) {
39+
tasks[idx] = task
40+
}
41+
}
42+
}
43+
44+
45+
func loadDummyTask() -> [TaskModel] {
46+
let title = [
47+
"아름다운 날씨",
48+
"푸르른 하늘",
49+
"산뜻한 봄바람",
50+
"작은 꽃 피어남",
51+
"햇살 가득한 날",
52+
"달콤한 커피 향기",
53+
"좋은 일만 있기를",
54+
"함께하는 행복한 시간",
55+
"신나는 음악 소리",
56+
"평화로운 마음"
57+
]
58+
let descriptions = [
59+
"바다에서 바람이 솔솔 부는 날, 작은 섬에 한 소녀가 살았다.",
60+
"가로등이 갈고리처럼 숨어있는 어둠 속, 도시는 잠들어가고 있었다.",
61+
"숲 속에서 나무들이 자신의 얘기를 속삭이듯, 나뭇잎이 춤을 추었다.",
62+
"고요한 밤, 별들은 하늘에 흩어져 있었고, 하나의 별은 빛나고 있었다.",
63+
"길을 걷다가 발밑에 꽃잎이 흩날리며 나를 반겨주었다.",
64+
"눈이 내려오는 날, 동네 사람들은 눈싸움을 즐기며 웃고 있었다.",
65+
"어린 왕자는 노란 장미꽃을 만나러 행성을 여행하고 다녔다.",
66+
"작은 창가에 앉아 차 한 잔을 마시며, 비오는 날의 여유를 즐겼다.",
67+
"시간이 멈춘 듯한 순간, 모든 것이 고요해진 산책로 위에서 바라본 뷰는 환상적이었다.",
68+
"마법의 문이 열리고 그 안에는 놀라운 모험이 펼쳐져 있었다."
69+
]
70+
71+
var tasks: [TaskModel] = []
72+
for i in 0..<5 {
73+
tasks.append(TaskModel(task: title[i], description: descriptions[i]))
74+
}
75+
76+
return tasks
77+
}

Todo/TodoApp.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import SwiftUI
99

1010
@main
1111
struct TodoApp: App {
12-
@State private var taskManager = TaskManager()
12+
@State private var taskManager = TaskManager(repo: MemoryTaskRepository())
1313

1414
var body: some Scene {
1515
WindowGroup {

0 commit comments

Comments
 (0)