VesselWheel

setValue 함수 본문

Xcode Study

setValue 함수

JasonYang 2024. 1. 18. 07:04

Sets the property of the receiver specified by a given key to a given value.

인스턴스 매소드로 부여된 key와 key를 쌍으로 저장한다. key값은 String으로 받는다. 

setValue(_:forKey:)

func setValue(
    _ value: Any?,
    forKey key: String
)

공식문서

https://developer.apple.com/documentation/objectivec/nsobject/1415969-setvalue

Todo 앱을 만들면서, Userdefaults를 이용한 데이터를 저장할 때 사용되는 setValue 매소드 

//
//  TodoStore.swift
//  TodoList
//
//  Created by woochan on 1/7/24.
//

import Foundation

/*
 앱이 종료되어도 데이터를 유지하려면 메모리가 아닌 저장장치(스마트폰의 경우 플래시 메모리) 에 저장되어야한다.

 저장방법 중 하나 : UserDefaults (요구사항)

 UserDefaults 특징 : key-value 쌍으로 저장할 수 있다.

 공식문서를 보자 : Todo 데이터 타입 은 저장할 수가 없다.
  1. Todo 를 [String: Any] 로 표현하여 배열로 저장
  2. [Todo] 를 JsonDecoder 를 사용하여 Data 를 저장
 */


final class TodoStore {
  
  static var shared: TodoStore = .init()
  
  private let key = "TodoList"
  
  private init() { }
  // CRUD
  
  func readAll() -> [Todo] {
    guard let todoListData = UserDefaults.standard.data(forKey: key),
          let todoList = try? JSONDecoder().decode([Todo].self, from: todoListData)
    else {
      return []
    }
    
    return todoList
  }
  
  func readAllAndCategorize() -> [String: [Todo]] {
    
    let todoList = readAll()
    
    return Dictionary(grouping: todoList) { todo in
      todo.category
    }
  }
  
  func add(_ todo: Todo) {
    
    var todoList = readAll()
    
    todoList.append(todo)
    
    guard let data = try? JSONEncoder().encode(todoList) else {
      return
    }
    
    UserDefaults.standard.setValue(data, forKey: key)
  }
  
  func delete(todoId: Int) {
    
    var todoList = readAll()
    
    todoList.removeAll { todo in
      todo.id == todoId
    }
    
    // 원하는 Todo 가 지워진 상태
    
    guard let data = try? JSONEncoder().encode(todoList) else {
      return
    }
    
    UserDefaults.standard.setValue(data, forKey: key)
  }
  
  func update(todoId: Int, isDone: Bool? = nil) {
    
    var todoList = readAll()
    
    guard let targetIndex = todoList.firstIndex(where: { $0.id == todoId })
    else {
      return
    }

    if let newIsDone = isDone {
      todoList[targetIndex].isDone = newIsDone
    }
    
    // 리스트가 업데이트된 상태
    
    guard let data = try? JSONEncoder().encode(todoList) else {
      return
    }
    
    UserDefaults.standard.setValue(data, forKey: key)
  }
}

//let sampleData1 [[String: Any]]= [
//  [
//    "id" : UUID().hashValue,
//    "description" : "책상 정리"
//    "isDone" : false,
//  ],
//  [
//    "id" : UUID().hashValue,
//    "description" : "먼지 털기"
//    "isDone" : true,
//  ],
//]


//let sampleData2: Data =
//"""
//[
//  {
//    "id" : 123129123213,
//    "description" : "책상 정리"
//    "isDone" : false,
//  },
//
//  {
//    "id" : 311293801298,,
//    "description" : "먼지 털기"
//    "isDone" : false,
//  }
//]
//"""

해석

setValue(_:forKey:) 메서드는 UserDefaults 객체에 값을 설정하는 메서드입니다.

이 메서드는 지정된 키에 해당하는 값을 설정하고 저장장치에 유지될 수 있도록 합니다.

위의 코드에서 add(_:) 메서드에서 UserDefaults.standard.setValue(data, forKey: key)를 사용하여 todoList를 저장하고 있습니다.

이 코드는 todoList를 Data 형식으로 인코딩하여 UserDefaults에 해당 키로 저장합니다.