[iOS] Property List

RudinP·3일 전
0

Study

목록 보기
273/273

Plist

  • 프로젝트 생성시 존재하는 Info.plist도 Property List이다.
  • xml 포맷으로 저장된다.
  • open as 를 통해 xml 편집기로 수정할 수 있다.
  • plist는 bundle에 추가된다.
    • 읽기 전용이다.
  • dictionary 혹은 Array 형태로 설정 가능

사용 경우

  • 설정 값 저장: 애플리케이션의 다양한 설정을 저장하여 사용자에게 사용자 지정 옵션을 제공
  • 데이터 구조화: 구조화된 데이터를 저장하고 관리해야 할 때, Property List를 사용하여 간단하게 데이터를 저장
  • 애플리케이션 정보 저장: 애플리케이션의 버전, 번들 아이디, UI 지원 방향 등 애플리케이션 관련 정보를 Property List에 저장
  • UserDefaults와 함께 사용: 사용자 기본 설정을 저장하고 관리하는 데 UserDefaults와 함께 사용
  • 데이터베이스 대체: 단순하고 적은 양의 데이터를 저장해야 할 때, 데이터베이스 대신 Property List를 사용
  • dictionary, 날짜, boolean과 같이 기본적인 작은 값을 저장하는데 적합하며, 이미지같이 큰 데이터를 저장하기엔 적합하지 않다.
  • 사용자 설정: 앱의 사용자 기본 설정을 저장하고 관리하는 데 적합
  • 솔직히 대안이 많아서 자주 활용되지는 않는다.

코드로 Plist 읽기

  • Bundle 클래스 사용
  • 반드시 root객체의 타입으로 읽어야 한다.
  • url의 경우 NSDictionary 생성자로 생성 후 dictionary 타입으로 타입캐스팅 하면 된다. (혹은 NSArrayArray 타입)
//plist의 파일 이름이 data 일 때
guard let url = Bundle.main.url(forResource: "data", withExtension: "plist") else {
	fatalError()
}

//NSDictionary 생성자 사용 후 Dictionary 타입캐스팅
//array로 설정한 경우 NSArray로 생성자 사용 후 Array로 타입캐스팅 하면 된다.
guard let dict = try? NSDictionary(contentsOf: url, error: ()) as? [String: String] else {
	fatalError()
}

더 나은 방법

  • propertyListDecoder 사용하기
  1. decoder 생성: 바이너리 형식의 데이터를 객체로 바꿔주는 작업을 함
  2. decode 하기
    • 첫번째 파라미터: 읽어올 형식 지정
    • 두번째 파라미터: 디코딩할 데이터 전달
do {
	let data = try Data(contentsOf: fileUrl)
    
    let decoder = PropertyListDecoder() //1
    let dict = try decoder.decode([String:String].self, from: data) //2
} catch {
	print(error)
}

Plist를 파일로 저장하기

파일 생성

let fileUrl: URL = {
//사용자의 documentDirectory url 가져오기
	let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
//plist 파일 url 생성
    return documentsDirectory.appendingPathComponent("data").appendingPathExtension("plist)
}()

파일 저장

  • 인코딩
  1. encoder 생성
  2. encode 하기
  3. write로 파일 저장
do {
	let encoder = PropertyListEncoder() //1
    let data = try.encoder.encode(dict) //2
    try data.wirte(to: fileUrl) //3
} catch {
	print(error)
}

Custom Type을 plist에 저장하기

  1. Codable 프로토콜을 채용한 Custom Type 구조체 생성
struct Development: Codable {
	let language: String
    let os: String
}
  1. 데이터 생성 및 저장 시 해당 Custom Type 사용
let decoder = PropertyListDecoder()
let dev = try decoder.decode(Development.self, from: data)
...
let dev = Development(language: "Swift", os: "macOS")
let encoder = PropertyListEncoder()
let data = try encoder.encode(dev)
try data.write(to: fileUrl)
profile
iOS 개발자가 되기 위한 스터디룸...

0개의 댓글