2016-10-07 2 views
21

-Disclaimer-
Я чрезвычайно новичок в разработке iOS и Swift, но я не особенно новичок в программировании.
Как читать с plist с помощью приложения Swift 3 iOS

У меня есть базовое приложение iOS с Swift3 элементами в нем.
Я создал файл plist с некоторыми элементами, которые я хочу читать и отображать в своем приложении. (Нет необходимости в записи)

Как вы можете прочитать значение для заданного ключа для связанного файла plist в Swift3?

Это кажется очень простым вопросом для меня, но множество поисков заставляет меня подвергать сомнению весь мой концептуальный подход.

Полезные советы будут оценены.

+0

посмотреть http://rebeloper.com/read-write-plist-file-swift/ и это HTTP: // WWW. learncoredata.com/plist/ –

+0

Сайт rebeloper, отмеченный выше, является ссылкой на библиотеку для обработки этих вещей.Это может быть здорово, я не знаю, но это, безусловно, длинная статья, описывающая процесс, который намного сложнее, чем этот процесс должен требовать. Второй сайт - это мертвая ссылка для меня в этот день. –

ответ

61

То же самое, что вы сделали в 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 лучше использовать общий тип массива Свифта и словарь вместо NSArray и NSDictionary.

Edit: Вместо 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) 
     } 
} 
+0

Большое спасибо. Я нашел много примеров для Swift! = 3. Я обеспокоен принятием Swift, так как я также слышал, что в течение очень короткой жизни у него было два довольно крупных переоформления. –

+8

@Doc Стоит отметить, что некоторые плиты предварительно определены. В частности, info.plist: '' 'static let BASE_URL = Bundle.main.infoDictionary! [" MY_BASE_URL "] as! String''' – Dilapidus

+2

Чтобы подчеркнуть очень хороший момент by @Dilapidus, правильный/принятый ответ на этот вопрос должен основываться на 'Bundle.main.infoDictionary' ... он вас ждет. Нет необходимости в дополнительном коде. – biomiker

2

Вот Swift 3 реализация, основанная на Nirav D's answer:

/// 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 
    } 
+2

Спасибо за новое предложение. Не могли бы вы рассказать мне, как это отличается от ответа Нирава Д? Мне нравится, что у вас есть обработка исключений. Это в основном это? –

+1

@JamesTSnell Спасибо за ваш вопрос. Два ответа в основном одинаковы. Я просто отвлек его ответ как функцию для быстрого вызова. Ответ Нирава D не обрабатывал исключение или что-то не так. Итак, в моей функции, если произойдут какие-то плохие вещи, она вернет нуль. Надеюсь на помощь. – Jerome

0

Для 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 
    } 
0

В 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() 
      } 

     } 
    } 
2

Вот пример того, как получить BundleID от Info PLIST:

var appBundleID = "Unknown Bundle ID"  
if let bundleDict = Bundle.main.infoDictionary, 
    let bundleID = bundleDict[kCFBundleIdentifierKey as String] as? String { 
     appBundleID = bundleID 
    } 

Точно так же вы можете легко получить доступ к любой клавише. Этот подход хорош для многих целевых проектов.

0

Вы также можете прочитать значение непосредственно из файла Plist просто

let value = Bundle.init(for: AppDelegate.self).infoDictionary?["your plist key name"] as? Any 
Смежные вопросы