Получить содержимое нескольких файлов в каталоге - PullRequest
0 голосов
/ 21 февраля 2019

Мне нужно получить содержимое из нескольких plist файлов и объединить их в один dictionary, который затем отображается в tableView

. Используя этот код, я могу вручную получить каждый путь исодержимое файла, но я должен быть в состоянии сделать это для всех plist-файлов в каталоге, а не только для этих предопределенных.

    func getFiles() {
    let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let path = documentDirectory.appending("/MainFolder/File1.plist")
    let path1 = documentDirectory.appending("/MainFolder/File2.plist")
    let path2 = documentDirectory.appending("/MainFolder/File3.plist")
    tableViewData = [NSDictionary(contentsOfFile: path) as! [String : String], NSDictionary(contentsOfFile: path1) as! [String : String], NSDictionary(contentsOfFile: path2) as! [String : String]]
    print(tableViewData)
}

Я отображаю tableViewData в моем tableView, который дает мне каждыйсодержимое файлов в отдельной строке.

Я предполагаю, что мне, вероятно, нужен массив URL-адресов файлов, отфильтрованных по .plist, а затем каким-то образом получить содержимое каждого файла в словарь [String : String].

Я новичок в swift, любая помощь или лучший способ сделать это было бы замечательно

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Прежде всего не используйте устаревшие и goal-c-ish NSSearchPathForDirectoriesInDomains в Swift.Используйте современный FileManager API.

Во-вторых, не используйте target-c-ish NSDictionary(contentsOf для чтения данных списка свойств.Используйте PropertyListSerialization.

Функция throws, которая означает, что она передает все возможные ошибки вызывающей стороне.Он фильтрует URL-адреса в каталоге по расширению plist и использует функцию map, чтобы получить словарь для каждого URL.

func getFiles() throws {
    let documentDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
    let subFolderURL = documentDirectory.appendingPathComponent("MainFolder")
    let allFiles = try FileManager.default.contentsOfDirectory(at: subFolderURL, includingPropertiesForKeys: nil)
    let properListFiles = allFiles.filter{$0.pathExtension == "plist"}
    tableViewData = try properListFiles.compactMap { url -> [String:String]? in
        let data = try Data(contentsOf: url)
        return try PropertyListSerialization.propertyList(from: data, format: nil) as? [String:String]
    }
    print(tableViewData)
}

Имейте в виду, что в изолированных приложениях папка Documents находитсяв контейнере приложения.

0 голосов
/ 21 февраля 2019

Вы можете прочитать все списки и перебрать их, добавив их содержимое либо в 1 массив, либо в уже сохраненный словарь.

do {

let directoryContents = try FileManager.default.contentsOfDirectory(at: documentDirectory, includingPropertiesForKeys: nil, options: [])


let allPlistFiles = directoryContents.filter{ $0.pathExtension == "plist" }
var aPlistArray = []
for aPlist in allPlistFiles {
aPlistArray.append(NSDictionary(contentsOfFile: path) as! [String : String])
}

} catch {
    print(error)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...