如何从Swift中的PLIST读取数据?

时间:2014-12-07 17:37:01

标签: ios swift xcode6 plist

我正面临使用swift从plist文件中读取数据的问题 my .plist file

我的代码:

        let Chapterpath = NSBundle.mainBundle().pathForResource("chapterMapping", ofType: "plist")
    let dict2 = NSDictionary(contentsOfFile: Chapterpath!)
    let chaptername = dict2?.objectForKey("chapterName")
    let chapterNumber = dict2?.objectForKey("pageNumber")

接下来我试图将plist数据添加到数组中,我应该只使用

var myArray = [chapterName]

我的问题:上面的代码是否正确? 或者我错过了什么 当我尝试使用println打印plist数据时((chapterName)) 我收到了一个错误

谢谢

5 个答案:

答案 0 :(得分:2)

首先,plist中的Root对象为NSArray而不是NSDictionary

其次,如果你想在基金会收藏中使用KVC(我不相信这适用于Swift的数组),你需要拨打valueForKeyPath

let chapterPath = NSBundle.mainBundle().pathForResource("chapterMapping", ofType: "plist")
if let arrayOfItems: [AnyObject] = NSArray(contentsOfFile: chapterPath!) {
    let chapterNames: [String] = arrayOfItems.valueForKeyPath("chapterName") as NSArray as [String]
    let pageNumbers: [Int] = arrayOfItems.valueForKeyPath("pageNumber") as NSArray as [Int]
}

第三,快速执行此操作的方法是使用map函数,但arrayOfItems需要是一个强定义类型,它可能比它的价值更多。例如:

let array: [ChapterMetaData] = // define it here
let chapterImages = array.map { $0.chapterImage }

答案 1 :(得分:1)

正如你所说,你有一个包含多个元素的数组。 objectForKey不搜索大厅树级别,并为您提供名称的第一个级别。你有多个值必须包含一个循环。请尝试以下方法:

var Chapterpath:NSString = NSBundle.mainBundle().pathForResource("chapterMapping", ofType: "plist");
var chapters:NSArray = NSArray(contentsOfFile: Chapterpath);

for chapter in chapters {
    let chaptername = chapter["chapterName"]
    let chapterNumber = chapter["pageNumber"]
    println(chaptername);
}

答案 2 :(得分:1)

使用以下代码将Plist数据读取到NSArray

let path = NSBundle.mainBundle().pathForResource(plistName, ofType: "plist")
var list = NSArray(contentsOfFile: path!) as [[String:String]]

答案 3 :(得分:1)

解析项目中AppConfig.plist文件的最简单方法:

var dictionaryObj: NSDictionary?
if let filePath = NSBundle.mainBundle().pathForResource("AppConfig", ofType: "plist") 
{
    dictionaryObj = NSDictionary(contentsOfFile: filePath)
}
if let dict = dictionaryObj 
{
    //parse it as NSDictionary
}
else
{
    //dictionaryObj is nil or doesn't contain anything.
}

答案 4 :(得分:0)

如果Plist Root是数组,则可以使用NSArray:

let path = NSBundle.mainBundle().pathForResource("OrderHelper", ofType: "plist")
let myArray = NSArray(contentsOfFile: path!)

如果Plist Root是词典,则可以使用NSDictionary:

let path = NSBundle.mainBundle().pathForResource("OrderHelper", ofType: "plist") {
let myDict = NSDictionary(contentsOfFile: path!)