-免责声明-
我对iOS和Swift开发非常陌生,但对编程也不是特别陌生。
我有一个包含Swift3
元素的基本iOS
应用程序。
我已经创建了一个plist
文件,其中包含一些我想要在应用程序中读取和显示的条目。(不需要写访问权限)
如何在Swift3中读取捆绑的 plist
文件的给定键的值?
这对我来说似乎是一个非常简单的问题,但一堆搜索让我对我的整个概念方法产生了疑问。
有帮助的建议将不胜感激。
发布于 2016-10-07 14:09:30
与您在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的泛型类型数组和字典,而不是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)
}
}
发布于 2018-03-12 13:02:19
随着Swift 4引入可编码
步骤1:从捆绑包中加载Plist文件。
第2步:使用PropertyListDecoder将属性列表值解码为语义类型。
第3步:创建可编码的结构
完整的代码-
func setData() {
// location of plist file
if let settingsURL = Bundle.main.path(forResource: "JsonPlist", ofType: "plist") {
do {
var settings: MySettings?
let data = try Data(contentsOf: URL(fileURLWithPath: settingsURL))
let decoder = PropertyListDecoder()
settings = try decoder.decode(MySettings.self, from: data)
print("toolString is \(settings?.toolString ?? "")")
print("DeviceDictionary is \(settings?.deviceDictionary?.phone ?? "")")
print("RootPartArray is \(settings?.RootPartArray ?? [""])")
} catch {
print(error)
}
}
}
}
struct MySettings: Codable {
var toolString: String?
var deviceDictionary: DeviceDictionary?
var RootPartArray: [String]?
private enum CodingKeys: String, CodingKey {
case toolString = "ToolString"
case deviceDictionary = "DeviceDictionary"
case RootPartArray
}
struct DeviceDictionary: Codable {
var phone: String?
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
phone = try values.decodeIfPresent(String.self, forKey: .phone)
}
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
toolString = try values.decodeIfPresent(String.self, forKey: .toolString)
deviceDictionary = try values.decodeIfPresent(DeviceDictionary.self, forKey: .deviceDictionary)
RootPartArray = try values.decodeIfPresent([String].self, forKey: .RootPartArray)
}
}
示例Plist文件-> https://gist.github.com/janeshsutharios/4b0fb0e3edeff961d3e1f2829eb518db
发布于 2017-09-08 10:03:22
这是一个基于Nirav D's answer的Swift 3实现
/// 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
}
https://stackoverflow.com/questions/39910461
复制相似问题