1. 程式人生 > >Swift 讀寫 plist 檔案

Swift 讀寫 plist 檔案

在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)" //其他可能是字串型別
        }
    }
}