Swift - NSUserDefaults

이원석·2024년 11월 28일

Swift

목록 보기
25/38

NSUserDefaults

애플에서 제공해주는 간단한 String Key-Value 형태의 저장소. 내부적으로 DB 사용
저장되는 값 들을 Preferences라고 부름

사용처

  • 앱이 꺼져도 특정 값이 저장되길 원하는 경우
  • 사용자 설정
  • 앱이 꺼져도 특정한 값이 저장되지만, 앱이 삭제되면 같이 사라지길 원하는 경우

특징

  • 앱이 꺼져도 데이터들이 유지되며, 앱이 삭제될 시 데이터들도 같이 사라짐
  • String Key-Value 형태의 저장소이며, 저장할 수 있는 값은 Int, Double, Float, String, Bool, Data와 이로 이루어진 Array, Dictionary만 가능(key로는 String만 가능)

간단하게 사용하기

standard를 이용한 저장/꺼내오기

//키로 String 사용
let stringKeyForUserDefault = "stringKey"
let immuatablestringKeyForUserDefault = "immutablestringKey"
let floatKeyForUserDefault = "floatKey"

//저장
UserDefaults.standard.set("졸려유", forKey: stringKeyForUserDefault)
UserDefaults.standard.set(4.5, forKey: floatKeyForUserDefault)
UserDefaults.stanard.set(NSMutableString(string: "Immutable"), forKey: immutablestringKeyForUserDefault)

//꺼내오기
print(UserDefaults.standard.string(forKey: stringKeyForUserDefault)
print(UserDefaults.standard.float(forKey: floatKeyForUserDefault))
print(UserDefaults.standard.string(forKey: immuatablestringKeyForUserDefault))

커스텀 클래스 객체를 저장하고 꺼내오기

커스텀 클래스의 객체를 저장하려면 NSKeyedAchiever를 이용해 Data(NSData)형식으로 변환해서 저장
1. 저장할 클래스를 NSObject의 하위클래스로, NSCoding 프로토콜을 준수하게 변경

class Person : NSObject ,NSCoding {
    var name : String
    var age : Int
    init(name aName :String, age aAge : Int) {
        self.name = aName
        self.age = aAge
    }
    //NSCoding Protocol 구현
    required init?(coder: NSCoder) {
        self.name = coder.decodeObject(forKey: "name") as! String
        self.age = coder.decodeInteger(forKey: "age")
    }
    func encode(with coder: NSCoder) {
        coder.encode(self.name, forKey: "name")
        coder.encode(self.age, forKey: "age")
    }
}
  1. NSKeyedArchiever로 Data로 변경 후 저장
do {
	//Data로 클래스를 변경합니다.
	//secureCoding을 true로 하려면, 클래스가 NSSecureCoding을 따라야 합니다.
	let mePropertyListData = try NSKeyedArchiver.archivedData(withRootObject: me, requiringSecureCoding: false)
    
    //저장합니다
	UserDefaults.standard.set(mePropertyListData, forKey: "me")
} catch {
    print(error)
}
  1. NSkeyedUnArchiever로 원하는 객체를 복구해오기
  • do-catch블럭으로 감싸 주어야 함
let achievedData = UserDefaults.standard.object(forKey: objectKey)
        
do {
	let person = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(achievedData as! Data) as! Person
	print(person.name)
	print(person.age)
} catch {
	print(error)
}

UserDefaults를 Dictionary형태로 가져오기

let standard = UserDefaults.standard
print(standard.dictionaryRepresentation())

참조>
lemon_dev

0개의 댓글