3.22 값 저장하기

Jay·2025년 2월 7일

Level 3 - SingleView App

목록 보기
22/24

Goal

사용자가 마지막에 선택한 값을 저장해보자.

Meterials

Class UserDefaults
사용자의 정보를 앱내에 저장할 수 있는 가장 간단한 구조의 인터페이스

Thinking First

경우에 따라 앱이 재실행 되어도 사용자가 선택한 값이 표시되어야 할 필요가 있다.
정보가 앱에 ‘저장'되어야 하므로 앞에서 배운 UserDefaults 클래스를 이용해보자.

Making Next

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int,
inComponent component: Int) {									
let defaults = UserDefaults.standard
defaults.set(row, forKey: "distancePickerRow") 
defaults.synchronize()

행이 선택될 때마다 ‘distancePickerRow’라는 키에 저장되도록 구현하였다.

pickerView: didSelectRow row: inComponent component: 메서드는 행이 선택될 때마다 변환된 값이 레이블에 표시되어야 하고 그 값을 저장해야 하는 두가지 기능을 수행해야 한다. 각각의 기능을 메서드로 구현해보자.

func displayConvertedDistanceForRow(_ row: Int) {
    	let kmeter = distanceRange?.values[row]
    	distanceLabel.text = "\(converter.toMile(kilo:kmeter!))mile"
	}

	
func saveSelectedRow(_ row: Int) {
    	let defaults = UserDefaults.standard
    	defaults.set(row, forKey: "distancePickerRow")
    	defaults.synchronize()
	}


class ViewController: UIViewController, UIPickerViewDelegate {

//"distancePickerRow" 도 미리 상수로 선언해 놓으면 실수를 예방할 수 있다.
	let userDefaultsLastRowKey = "distancePickerRow"  

이제 다음과 같이 변경되어야 할 것이다.

func saveSelectedRow(_ row: Int) {
    	let defaults = UserDefaults.standard
    	defaults.set(row, forKey: userDefaultsLastRowKey)
    	defaults.synchronize()

최종적으로 두가지 메서드를 호출하도록 아래와 같이 리팩토링 한다.

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    	displayConvertedDistanceForRow(row)
    	saveSelectedRow(row)
	}						

Closing

간단한 정보를 저장하는데 UserDefaults 는 쉽고 강력하다. 또한 같은 기능을 구현하더라도 각각의 기능을 분리한 메서드를 구현하여 호출하도록 리팩토링하는 습관을 들이면 코드가 깔끔해지고 가독성이 좋아진다. 이는 버그를 줄여주고 유지보수를 편리하게 해줄 것이다.

profile
Software Engineer Specialized on iOS

0개의 댓글