Swift 3.0에서 UserDefaults 사용하기

2016-12-31
13 Views

UserDefaults는 간단하게 데이터지속성이 필요한 경우가 많기 때문에 자주 사용되는 기능이다. 보통 필자는 앱내에서 설정이나 사용자정보를 저장할 경우에 자주 사용한다.

다만, 이 UserDefaults가 Swift 3.0으로 나오면서 많은 변화가 있어 정리해보았다.

1) 인스턴스 생성

[이전]

[Swift 3.0]

소스코드를 보면 NSUserDefaults에서 UserDefaults로 변경되었고 인스턴스 생성도 stanadardUserDefaults()메소드에서 standard 속성으로 변경되었다.

2) 저장

[이전]

[Swift 3.0]

저장관련 메소드는 set(_: forKey:)구조로 되어 있다. 컴파일러가 첫번째 파라미터의 형을 유추하여 알맞은 메소드가 호출하는 구조이다.

3) 읽기

[이전]

[Swift 3.0]

4) 삭제

[이전]

[Swift 3.0]

5) 존재 확인

[이전]

[Swift 3.0]

6) Synchronize

비추천

7) 전체 데이터 삭제

8) UserDefaults 문제점

보통 UserDefaults의 키명은 저장 및 읽을 때 여러번 사용될 가능성이 높기 때문에 상수로 하는 것이 일반적이다. 그러나 이 방법은 문자열 상수를 사용하고 있기 때문에 잘못 코딩하여 버그를 유발할 수 있는 가능성이 높다. 그래서 추천하는 방법은 잘못 코딩하는 실수를 방지하기 위해 정수로 정의하는 문자열을 Enum으로 변경하는 것이 좀더 안심이 된다.

enum은 열거자에 String형의 Raw값 tel을 지정할 수 있어 문자열을 직접 tel이라고 작성할 필요가 없다.

그럴지만 위와 같은 방식으로 잘못 코딩하는 오류를 줄일 수 있지만 키명에 Constants.User.tel.rawValue라고 하는 것은 비효율적이고 Swift언어를 사용하는 개발자라면 프로토콜 확장을 통해 간결하게 처리할 수 있다.

사용방법은 아래와 같다.

UserDefaults의 저장 및 읽어오는 코드가 더 간결했졌다. KeyNamespaceable은 UserDefaults 키명의 충돌을 막기 위한 프로토콜이다. 이를 적용하여 키명은 UserDefaults.tel되지만 알맞지 않은 네임스페이스가 포함되어 있지 않는 단순한 tel이 되어 버리기 때문에 충돌문제가 발생할 가능성이높다.

StringDefaultSettable은 UserDefaults에 String형 값을 저장해석하는 프로토콜이다. 이 확장 메소드는 set(_: forKey:), string(forKey:)는 UserDefaults API와 동일하다.

실제 프로젝트에서는 예로 tel 전화번호와 같은 정보는 모델클래스 속성으로 구성하는 경우가 많다고 본다. 그렇기 때문에 StringDefaultSettable 프로토콜 적합성을 UserDefaults에 한정하고 있지 않고 있때문에 다음과같은 모델클래스에도 사용이 가능하다.

UserDefaults에서 tel을 가지고 아무 전화번호나 소스코드에서 읽을 수 없지만 User에서 tel을 가지면 사용자 전화번호라는 것이 더 명확해 진다.

Facebook Comments

You may be interested

Xcode 기능 확장(Extension) 제거하기
Xcode
shares3 views
Xcode
shares3 views

Xcode 기능 확장(Extension) 제거하기

MJ Kim - 3월 18, 2017

Mac에서 Xcode Source Editor Extension등의 기능확장을 사용하다보면 디버깅시 시스템 환경 설정의 확장이 앱에 등록되는 경우가 있다. 계속해서 목록이 남아 있기…

iOS App Store Review(앱 심사약관) 번역
Swift 3.0
shares112 views
Swift 3.0
shares112 views

iOS App Store Review(앱 심사약관) 번역

MJ Kim - 3월 15, 2017

App Store Review를 번역했다. 사실 이번에 좀 애매한 리젝을 당해서 그걸 이해하고자 정리해본다. 원문링크: https://developer.apple.com/app-store/review/guidelines/ 1. 이약관은? 1.1 앱 개발자로서 프로그램의…

Raspberry Pi 타이머 On/Off 전원제어모듈 RPi1114-Raspberry Pi
IoT by Raspberry Pi
shares7 views
IoT by Raspberry Pi
shares7 views

Raspberry Pi 타이머 On/Off 전원제어모듈 RPi1114-Raspberry Pi

MJ Kim - 3월 04, 2017

RPi1114-Raspberry Pi전원제어 모듈이 있다. 이 제품은 40Pin GPIO핀헤더에 연결하여 사용하는 모듈로 Cortax-M0마이크로컨트롤러 LPC1114를 내장하고 Raspberry Pi의 시작과 정지 순서등을 프로그래밍할…