본문 바로가기
iOS

[20일차] TodoList 앱 만들기 - 1

by 디지털노마더 2020. 8. 8.

최초로 만드는 iOS 앱으로 TodoList(할일) 앱을 만들어보고자 한다.

우선 만들기 전에, 강의에서 필요로 하는 개념에 대한 정리를 해보고자 한다.

 

* 데이터 저장
 : NSCoding, Property List, Serialization, Core Data, Realm

- 데이터가 많을 때
 : Core Data, Realm 권장

- Codable(Swift 4) : JSON 데이터를 효율적으로 다룰 때 사용

* Tab Controller 추가 방법
 : StroyBorard에서 View 선택 및 Editor -> Embed in -> Tab Controller 선택

 

* 할일을 추가/수정/삭제하는 클래스(TodoManager)에 대한 함수를 정의해보자.

// 여러개의 TodoList 목록을 관리 (TodoManager)
class TodoManager {
    
    static let shared = TodoManager() // Singleton 객체 형태
    
    static var lastId: Int = 0
    
    var todos: [Todo] = []
    
    func createTodo(detail: String, isToday: Bool) -> Todo {
        // [x] TODO: create로직 추가
        let nextId = TodoManager.lastId + 1
        TodoManager.lastId = nextId
        return Todo(id: nextId, isDone: false, detail: detail, isToday: isToday)
    }
    
    func addTodo(_ todo: Todo) {
        // [x] TODO: add로직 추가
        todos.append(todo)
        saveTodo()
    }
    
    func deleteTodo(_ todo: Todo) {
        //TODO: delete 로직 추가
        
        // 방법1 (간단히 표현)
        todos = todos.filter{ $0.id != todo.id }
        
        // 방법1 (filter를 활용하여 기존의 TodoList와 신규생성한 TodoList 목록 비교)
        /*
        todos = todos.filter { existingTodo in
            return existingTodo.id != todo.id
        }
        */
        
        // 방법2 (효율적)
        /*
        if let index = todos.firstIndex(of: todo) {
            todos.remove(at: index)
        }
        */
        
        saveTodo()
    }
    
    func updateTodo(_ todo: Todo) {
        //TODO: updatee 로직 추가
        
        guard let index = todos.firstIndex(of: todo) else { return }
        todos[index].update(isDone: todo.isDone, detail: todo.detail, isToday: todo.isToday)
        saveTodo()
        
    }
    
    func saveTodo() {
        Storage.store(todos, to: .documents, as: "todos.json")
    }
    
    func retrieveTodo() {
        todos = Storage.retrive("todos.json", from: .documents, as: [Todo].self) ?? []
        
        let lastId = todos.last?.id ?? 0
        TodoManager.lastId = lastId
    }
}

 

<앱 초안 이미지>

TodoList 초안

 

댓글