如何阅读与Swift 3 iOS应用程序的plist

-Disclaimer-
我对iOS和Swift开发非常陌生,但我并不是特别不熟悉编程。

我有一个基本的iOS应用程序,其中包含Swift3元素。
我创build了一个plist文件,其中包含一些我想要读取并显示在应用程序中的条目。 (不需要写入权限)

在Swift3中,如何读取捆绑plist文件的给定键的值?

这对我来说似乎是一个非常简单的问题,但是一大堆search正在使我质疑我的整个概念方法。

有用的提示将不胜感激。

你在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的genericstypesArray和Dictionary来代替NSArrayNSDictionary

编辑:而不是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) } } 

这是一个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 } 

对于Swift 3.0,直接定位到密钥的代码如下。 字典对象将在你的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 } 

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

以下是如何从Info plist获取BundleID的示例:

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

用同样的方法你可以很容易地访问任何键。 这种方法对于许多目标项目是有益的。