Как читать с plist с помощью приложения Swift 3 iOS
-Disclaimer-
У меня есть базовое приложение iOS
с элементами Swift3
.
Я создал файл plist
с некоторыми элементами, которые я хочу читать и отображать в своем приложении. (Нет необходимости в записи)
Как вы можете прочитать значение для заданного ключа для связанного файла plist
в Swift3?
Мне кажется, это очень простой вопрос, но множество поисков заставляет меня подвергать сомнению весь мой концептуальный подход.
Полезные советы будут оценены.
Ответы
Ответ 1
То же самое, что вы сделали в Swift 2.3 или ниже, просто изменился синтаксис.
if let path = Bundle.main.path(forResource: "fileName", ofType: "plist") {
//If your plist contain root as Array
if let array = NSArray(contentsOfFile: path) as? [[String: Any]] {
}
////If your plist contain root as Dictionary
if let dic = NSDictionary(contentsOfFile: path) as? [String: Any] {
}
}
Примечание: В Swift лучше использовать массив типа Swift и Array и словарь вместо NSArray
и NSDictionary
.
Изменить: Вместо NSArray(contentsOfFile: path)
и NSDictionary(contentsOfFile:)
мы также можем использовать PropertyListSerialization.propertyList(from:)
для чтения данных из файла plist
.
if let fileUrl = Bundle.main.url(forResource: "fileName", withExtension: "plist"),
let data = try? Data(contentsOf: fileUrl) {
if let result = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [[String: Any]] { // [String: Any] which ever it is
print(result)
}
}
Ответ 2
Вот реализация Swift 3 на основе ответа Nirav D:
/// Read Plist File.
///
/// - Parameter fileURL: file URL.
/// - Returns: return plist content.
func ReadPlist(_ fileURL: URL) -> [String: Any]? {
guard fileURL.pathExtension == FileExtension.plist, let data = try? Data(contentsOf: fileURL) else {
return nil
}
guard let result = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [String: Any] else {
return nil
}
print(result)
return result
}
Ответ 3
Вот пример, как получить BundleID из Info plist:
var appBundleID = "Unknown Bundle ID"
if let bundleDict = Bundle.main.infoDictionary,
let bundleID = bundleDict[kCFBundleIdentifierKey as String] as? String {
appBundleID = bundleID
}
Таким же образом вы можете легко получить доступ к любому ключу. Этот подход хорош для многих целевых проектов.
Ответ 4
Для Swift 3.0, следующий код напрямую нацелен на ключ. Где объект dict даст все, что будет в вашем файле plist.
if let path = Bundle.main.path(forResource: "YourPlistFile", ofType: "plist"), let dict = NSDictionary(contentsOfFile: path) as? [String: AnyObject] {
let value = dict["KeyInYourPlistFile"] as! String
}
Ответ 5
В файле AppDelegate
var bundlePath:String!
var documentPath:String!
var plistDocumentPath:URL!
let fileManager = FileManager()
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
{
bundlePath = Bundle.main.path(forResource: "Team", ofType: "plist")
documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
plistDocumentPath = URL.init(string: documentPath)?.appendingPathComponent("Team.plist")
print(plistDocumentPath.path)
if !fileManager.fileExists(atPath: plistDocumentPath.path){
do {
try fileManager.copyItem(atPath: bundlePath, toPath: plistDocumentPath.path)
} catch {
print("error Occured \(error.localizedDescription)")
}
}
return true
}
В ViewController
@IBOutlet weak var TeamTable: UITableView!
var appDelegate:AppDelegate!
var arrayForContacts:[[String:Any]]! // array object
override func viewDidLoad() {
super.viewDidLoad()
appDelegate = UIApplication.shared.delegate as! AppDelegate
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if appDelegate.fileManager.fileExists(atPath: appDelegate.plistDocumentPath.path){
arrayForContacts = []
if let contentOfPlist = NSArray.init(contentsOfFile: appDelegate.plistDocumentPath.path ){
arrayForContacts = contentOfPlist as! [[String:Any]]
TeamTable.reloadData()
}
}
}