Swifter {Swift Developer}

메뉴

Swift 3.0에서 UserDefaults 사용하기

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

카테고리:   Swift 3.0

댓글

죄송하지만 댓글은 닫혀 있습니다.