2015-12-06 85 views
2

我在獲取簡單的命令行時遇到實際問題OSX Swift程序從簡單的.plist XML文件讀取數據 - 事實上,程序無法即使看起來存在並複製到文件夾中,也可以看到該文件。Swift無法找到並讀取屬性列表(.plist)文件

的數據由,是爲了讀出和所述的plist數據複製到其中它可以無需plist中需要被再次查詢檢索的陣列的類處理:

// Datadump.swift 

import Foundation 

class Datadump { 

    //array of dictionaries containing string keys and any datatype of value 
    var dataArray : Array<Dictionary<String,AnyObject>> 

    init() { 
     //copies data from plist 
     let bundle = NSBundle.mainBundle() 
     let path = bundle.pathForResource("Hardware", ofType: "plist") 
     //check file located 
     print("File Location: \(path) ") 
     let productArray = NSArray(contentsOfFile: path!) 

     dataArray = productArray as! Array<Dictionary<String,AnyObject>> 
     } 

    //returns tuple based on product id 
    func getData(prodId: Int) -> (String, Int) { 

     //returned vars 
     var price = 0 
     var name : String = "" 

     //iterate through array until relevant product is found 
     for dict in dataArray{ 
      if dict["ProdId"] as! Int == prodId{ 
       price = dict["Price"] as! Int 
       name = dict["Name"] as! String 
       break 
      } 
     } 
     return (name, price); 
    } 

} 

然而,程序失敗一個致命的錯誤,一旦:達到

let productArray = NSArray(contentsOfFile: path!) 

線,與輸出:

文件位置:無致命錯誤:意外發現零,而unwrappin g an可選值

打印語句確認程序無法找到Hardware.plist文件。

主程序只是創建和類的實例,並運行一個功能,但顯然上面提到的類運行,一旦失敗,因爲在init():

// main.swift 

import Foundation 

//creates instance of Datadump class 
var myData = Datadump() 

//queries data, copies result to tuple 
let (nam, pri) = myData.getData(123) 
print ("Name: \(nam) Price: \(pri)") 

的Hardware.plist文件看起來像這個:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<array> 
    <dict> 
     <key>Name</key> 
     <string>Intel i7 CPU</string> 
     <key>Price</key> 
     <integer>13995</integer> 
     <key>ProdId</key> 
     <integer>123</integer> 
    </dict> 
    <dict> 
     <key>Name</key> 
     <string>19&quot; Monitor</string> 
     <key>Price</key> 
     <integer>9995</integer> 
     <key>ProdId</key> 
     <integer>456</integer> 
    </dict> 
    <dict> 
     <key>Name</key> 
     <string>8GB DDR Ram</string> 
     <key>Price</key> 
     <integer>4595</integer> 
     <key>ProdId</key> 
     <integer>789</integer> 
    </dict> 
</array> 
</plist> 

我試過了我能想到的一切,包括查看.plist文件的設置並以不同的方式重新導入它。

任何幫助將不勝感激!

非常感謝, Kwangle

+0

「儘管它似乎存在並複製到捆綁」但沒有「貌似」。是或不是?我敢打賭,事實並非如此。你可以打開構建的應用程序,直接看它,看看,你知道。 – matt

+0

它在文件導航器中可見,我使用了「添加文件」功能並直接將其拖到項目窗口中。我將如何明確檢查?謝謝你的幫助。 – Kwangle

+0

「我使用了」添加文件「功能,並直接將其拖到項目窗口中」將其添加到_project_,但不一定會將其添加到_app target_。 – matt

回答

8

通常情況下,這是你要做的:

在Project Navigator(左側),選擇plist文件。在文件檢查器(在右側),檢查目標成員資格設置。您可能會發現應用程序目標是而不是已檢查。這意味着當您構建它時,plist文件是而不是被複制到應用程序包中。檢查應用程序目標,一切都會好的。

但是你不能這樣做,因爲這是一個命令行程序。這是一個可執行文件,沒有更多。沒有要複製的包。你試圖做的是形而上的不可能的事情。

+1

比較我的答案在這裏(與屏幕截圖):http://stackoverflow.com/a/30146303/341994 – matt

+1

是的,但應用程序複選框灰顯,無法檢查。 – Kwangle

+1

下面是plist文件信息的屏幕截圖,請注意不能更改的灰色複選框:http://imgur.com/ghMjagl – Kwangle

2

In Swift 3.0

獲取的.plist路徑

func getPath() -> String { 
     let plistFileName = "fileName.plist" 
     let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) 
     let documentPath = paths[0] as NSString 
     let plistPath = documentPath.appendingPathComponent(plistFileName) 
     return plistPath 
} 

要檢查的.plist文件是否在文件目錄存在與否。

let plistPath = self.getPath() 
     if FileManager.default.fileExists(atPath: plistPath) { 
      //fileName.plist Found 
     } 
+0

那麼我們必須在哪裏儲存plist以便使用它?用戶/文件?這工作!但是,這怎麼可能投入生產代碼? – Fluidity

+0

文件系統編程指南和'FileManager'?我想在文檔(或其他地方)中創建一個文件夾來爲每個項目存儲plists。 – Fluidity