2014-12-07 3 views
3

я столкнулся с проблемой с чтением данных из файла Plist используя быстрые my .plist fileКак читать данные из PLIST в Swift?

мой код:

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

рядом я пытаюсь добавить данные Plist в массив, должен я просто использовать

вопрос: верный ли код? или им я что-то отсутствует и когда я пытался напечатать данные Plist используя Println ((chapterName)) я получил ошибку

спасибо

+0

Как задать вопрос: В чем проблема? Вы попробовали? Что вы пробовали? Когда вы это сделали, что случилось? Это то, что вы хотели? Если нет, какая разница между тем, что произошло и что вы хотели? – matt

+0

сообщение отредактировано, спасибо –

ответ

2

Во-первых, ваш Root объект в PLIST является NSArray не NSDictionary.

Во-вторых, если вы хотите использовать KVC в коллекциях Foundation (я не думаю, что это работает с массивом 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

Как вы говорите, у вас есть массив с несколькими элементами. 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); 
} 
+0

var chapters: NSArray = NSArray (contentsOfFile: Chapterpath). я получил ошибку: дополнительные аргументы 'contentOfFile' в вызове –

+0

ошибка времени выполнения или компиляции? – hasan83

+0

ошибка компиляции –

1

Используйте следующий код для чтения Plist данных в NSArray:

let path = NSBundle.mainBundle().pathForResource(plistName, ofType: "plist") 
var list = NSArray(contentsOfFile: path!) as [[String:String]] 
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. 
} 
+0

Работа во всех проектах Swift. Я выполнил этот код в Swift 2.0. (XCode 7.1.0) –

0

Вы можете используйте NSArray, если PlistRoot is Array:

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

Вы можете использовать NSDictionary если PlistRoot является словарь:

let path = NSBundle.mainBundle().pathForResource("OrderHelper", ofType: "plist") { 
let myDict = NSDictionary(contentsOfFile: path!) 
Смежные вопросы