Swift 讀寫 plist 檔案
阿新 • • 發佈:2018-11-11
在MacOS專案中使用Swift管理plist,實現讀寫plist檔案。
1. Jobs.swift
使用Jobs類管理Jobs.plist
// Jobs.swift
// Created by Cyril on 18/7/11.
// Copyright © 2018年 GJ. All rights reserved.
import Foundation
class Jobs: NSObject {
var RestoreSequence_1: Dictionary<String , AnyObject?> = [:]
var RestoreSequence_2: Dictionary<String , AnyObject?> = [:]
var RestoreSequence_3: Dictionary<String , AnyObject?> = [:]
let dModel = DataModel()
//構造方法
override init(){
super.init()
print("[Jobs] 初始化...")
onCreateData("Jobs.plist")
let d = dModel.loadData("Jobs", dFilePath: "Jobs.plist" )
let skey:String = "RestoreStage"
print("查詢\(skey)結果:\(dModel.searchValueByKey(d, skey: skey))")
}
func onCreateData(fileName: String){
print("[Jobs]: 開始建立plist檔案")
//Document path 本地資料資料路徑 .plist格式
let fileManager = NSFileManager.defaultManager()
let localDataPath:String = dModel.dataFilePath(fileName)
print("[Jobs]: " + localDataPath)
var isLocalDataExisted = fileManager.fileExistsAtPath(localDataPath)
print("isLocalDataExisted->\(isLocalDataExisted)")
//判斷.plist檔案是否存在
if isLocalDataExisted == false//檔案不存在
{
fileManager.createFileAtPath(localDataPath, contents: nil, attributes: nil)//建立.plist檔案
}
isLocalDataExisted = fileManager.fileExistsAtPath(localDataPath)
print("isLocalDataExisted->\(isLocalDataExisted)")
//設定root
let root = NSMutableDictionary()
//設定dictionay
root.setValue(
[
"RestoreSequence_1":[
"RestoreStage" : "P1",
"Input_Type" : "Uart_Diags",
"TempValues" : [
"MLBSN" : "#ProgramWriteToIt#",
"FGSN" : "#ProgramWriteToIt#",
"Mod#" : "#ProgramWriteToIt#",
"Regn" : "#ProgramWriteToIt#",
],
"Command_Device" : [
"TTPowerSupply" : "#TT治具上電命令#",
"MLBSN" : "syscfg print MLB#",
"Write_FGSN" : "sn #FGSN#",
"Print_FGSN" : "sn",
"Write_Mod" : "syscfg add Mod# #Mod##",
"Print_Mod" : "syscfg print Mod#",
"Write_Regn" : "syscfg add Regn #Regn#",
"Print_Regn" : "syscfg print Regn",
"LogCollection" : "#LogCollection#",
"Restart" : "#TT治具重新上電命令#"
],
"Command_Host" : [
"暫時為空" : "暫時為空"
]
],
"RestoreSequence_2":[
"RestoreStage" : "P2",
"Input_Type" : "Uart_iBoot",
"TempValues" : [
"MLBSN" : "#ProgramWriteToIt#",
"FGSN" : "#ProgramWriteToIt#",
"#暫時為空#" : "#暫時為空#",
],
"Command_Device" : "#暫時為空#",
"Command_Host" : [
"暫時為空" : "暫時為空"
]
],
"RestoreSequence_FG":[
"RestoreStage" : "FG",
"Input_Type" : "Uart_OS",
"TempValues" : [
"FGSN" : "#ProgramWriteToIt#",
"#暫時為空#" : "#暫時為空#",
],
"Command_Device" : "#暫時為空#",
"Command_Host" : [
"暫時為空" : "暫時為空"
]
],
], forKey: "Jobs")
//將root寫入.plist檔案
root.writeToFile(localDataPath, atomically: true)
isLocalDataExisted = fileManager.fileExistsAtPath(localDataPath)
if isLocalDataExisted == true{
print("[Jobs]: Jobs.plist檔案建立完成")
}else{
print("[Jobs]: Jobs.plist檔案建立失敗")
}
/* try! fileManager.removeItemAtPath(localDataPath)//刪除本地資料檔案 */
}
}
2. DataModel.swift
// DataModel.swift
// Created by Cyril on 18/7/11.
// Copyright © 2018年 GJ. All rights reserved.
import Foundation
class DataModel: NSObject {
var userList = [UserInfo]()
// var keyArray: Dictionary = [Int: String] ()
//獲取沙盒資料夾路徑
func documentsDirectory()->String {
/* let paths = NSSearchPathForDirectoriesInDomains(
NSSearchPathDirectory.DocumentationDirectory,NSSearchPathDomainMask.UserDomainMask,true)
let documentsDirectory:String = paths.first! as String */
let path = "./Cyril/Anole"
return path
}
/**
獲取資料檔案地址
Eg:
fileName:userList.plist
*/
func dataFilePath (fileName: String)->String{
print(documentsDirectory().stringByAppendingString("/" + fileName))
return documentsDirectory().stringByAppendingString( "/\(fileName)")
}
/**
讀取資料
Eg:
key: userList
dFilePath: userList.plist
*/
func loadData(key: String, dFilePath: String)-> NSDictionary{
//判斷.plist檔案是否存在
let fileManager = NSFileManager.defaultManager()
let isLocalDataExisted = fileManager.fileExistsAtPath(self.dataFilePath(dFilePath))
print("isLocalDataExisted->\(isLocalDataExisted)")
if isLocalDataExisted == false//檔案不存在
{
fileManager.createFileAtPath(self.dataFilePath(dFilePath), contents: nil, attributes: nil)//建立.plist檔案
}
let dicFromPList: NSDictionary? = NSDictionary(contentsOfFile: "/Users/coreos/Desktop/Cyril/Anole/Jobs_P1P2FG.plist")
print("檔案 " + dFilePath + " 讀取完成")
return dicFromPList!
}
/**
* 通過key查詢在字典中的value值
*/
func searchValueByKey(dic: NSDictionary, skey: String)-> String{
var printHead = "[searchValueByKey]: "
if (dic.count == 0){
return printHead + "輸入的引數字典為空"
}
//plist 四層結構遍歷(尚有bug未更正)
for (key1, value1) in (dic as! NSMutableDictionary) {
// keyArray.updateValue(key as! String, forKey: 1)
print("第1層->字典 key \(key1) - 字典 value () \(value1)")
if(key1 as! String == skey){
print("\(printHead)\(skey)查詢成功, 為根字典")
return "查詢的\(skey)的值為\(value1)"
}
for (key2, value2) in (value1 as! NSMutableDictionary) {
print("第2層->字典 key \(key2) - 字典 value \(value2)")
if(key2 as! String == skey){
print("\(printHead)\(skey)查詢成功, 在字典\(key1)下")
return "查詢的\(skey)的值為\(value2)"
}
for (key3, value3) in (value2 as! NSMutableDictionary) {
print("第3層->字典 key \(key3) - 字典 value \(value3)")
if(key3 as! String == skey){
print("\(printHead)\(skey)查詢成功, 在字典\(key2)下")
return "查詢的\(skey)的值為\(value3)"
for (key4, value4) in (value3 as! NSMutableDictionary) {
print("第4層->字典 key \(key4) - 字典 value \(value4)")
if(key4 as! String == skey){
print("\(printHead)\(skey)查詢成功, 在字典\(key3)下")
return "查詢的\(skey)的值為\(value4)"
}
}
}
}
}
}
return "\(printHead)輸入的引數字典為空"
}
/**
* 值型別判斷
*/
func judgeValueType(dic: AnyObject) -> String{
if let dict1 = dic as? NSMutableDictionary{
return "NSMutableDictionary"
}else if let dict1 = dic as? NSDictionary{
return "NSDictionary"
}else if let dict1 = dic as? NSArray{
return "NSArray"
}else if let dict1 = dic as? NSValue{
return "NSValue"
}else{
return "\(dic)" //其他可能是字串型別
}
}
}