사용자가 마지막에 선택한 값을 저장해보자.
Class UserDefaults
사용자의 정보를 앱내에 저장할 수 있는 가장 간단한 구조의 인터페이스
경우에 따라 앱이 재실행 되어도 사용자가 선택한 값이 표시되어야 할 필요가 있다.
정보가 앱에 ‘저장'되어야 하므로 앞에서 배운 UserDefaults 클래스를 이용해보자.
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)
}
간단한 정보를 저장하는데 UserDefaults 는 쉽고 강력하다. 또한 같은 기능을 구현하더라도 각각의 기능을 분리한 메서드를 구현하여 호출하도록 리팩토링하는 습관을 들이면 코드가 깔끔해지고 가독성이 좋아진다. 이는 버그를 줄여주고 유지보수를 편리하게 해줄 것이다.