
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
타입으로 타입캐스팅 하면 된다. (혹은 NSArray
후 Array
타입)
guard let url = Bundle.main.url(forResource: "data", withExtension: "plist") else {
fatalError()
}
guard let dict = try? NSDictionary(contentsOf: url, error: ()) as? [String: String] else {
fatalError()
}
더 나은 방법
- decoder 생성: 바이너리 형식의 데이터를 객체로 바꿔주는 작업을 함
- decode 하기
- 첫번째 파라미터: 읽어올 형식 지정
- 두번째 파라미터: 디코딩할 데이터 전달
do {
let data = try Data(contentsOf: fileUrl)
let decoder = PropertyListDecoder()
let dict = try decoder.decode([String:String].self, from: data)
} catch {
print(error)
}
Plist를 파일로 저장하기
파일 생성
let fileUrl: URL = {
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
return documentsDirectory.appendingPathComponent("data").appendingPathExtension("plist)
}()
파일 저장
- encoder 생성
- encode 하기
- write로 파일 저장
do {
let encoder = PropertyListEncoder()
let data = try.encoder.encode(dict)
try data.wirte(to: fileUrl)
} catch {
print(error)
}
Custom Type을 plist에 저장하기
Codable
프로토콜을 채용한 Custom Type 구조체 생성
struct Development: Codable {
let language: String
let os: String
}
- 데이터 생성 및 저장 시 해당 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)