Swift:如何在 plist 的数组中读取多个数组?
Posted
技术标签:
【中文标题】Swift:如何在 plist 的数组中读取多个数组?【英文标题】:Swift: How to read multiple array within array in plist? 【发布时间】:2017-09-19 02:46:55 【问题描述】:这是我的清单
集合视图
使用 Swift 3,我正在读取 plist 以用这段代码完美地填充我的数组,但是当 plist 在根数组中有数组时,我不知道如何访问它
当根是数组时我用来读取的代码
var mainGroup = [String]()
var myArray: [String]?
if let path = Bundle.main.path(forResource: "items", ofType: "plist")
myArray = NSArray(contentsOfFile: path) as? [String]
mainGroup = myArray!
但是在这个 plist 中,要读取的数组不仅仅是根。我想在我的集合视图中读取根有多少个数组,我在numberOfItemsInSection
、cellForItemAt
和didSelectItemAt
中使用它。而且我还想读取数组中的项目,以便在选择项目时将其显示在集合的详细视图中。
结论:我想读取根数组中有多少个数组以在.count
中使用它,以及如何访问数组中的项目以将其作为详细信息显示在另一个视图控制器中。要访问一个数组,它将是 array[2]
但如果我想显示字符串 "Jeans" 和 "4" 等,那将如何工作。谢谢
【问题讨论】:
【参考方案1】:在 Swift 中推荐的读取属性列表文件的方法是PropertyListSerialization
。它避免使用 Foundation NSArray
。
代码打印部分编号和内部数组中的所有项目。
如果属性列表应该填充表格视图,我建议将内部数组声明为字典。
let url = Bundle.main.url(forResource:"items", withExtension: "plist")!
do
let data = try Data(contentsOf:url)
let sections = try PropertyListSerialization.propertyList(from: data, format: nil) as! [[Any]]
for (index, section) in sections.enumerated()
print("section ", index)
for item in section
print(item)
catch
print("This error must never occur", error)
【讨论】:
如何在我选择的数组中抓取一个项目并打印它?我知道我可以将它附加到数组中,但获取索引会很复杂 数组是基于索引的。您可以使用section[2]
获得物品。但正如答案中提到的,它更适合使用字典(键/值对)
绝妙的答案!开箱即用。要回答 BroSimple - 例如,您可以访问文件中第 5 个数组的第 2 个元素为sections[4][1] -sections[4] 返回第 5 个位置的数组(从 0 开始),然后 [ 1] 后缀从该数组中获取第二个元素。【参考方案2】:
我已经分别用 rootArray & subArray 添加了评论
override func viewDidLoad()
super.viewDidLoad()
readPlist()
func readPlist()
let path = Bundle.main.path(forResource: "SampleData", ofType: "plist")
let rootArray = NSArray(contentsOfFile: path!)!
print(rootArray.count)//Gives count for total objects. You can use in number of rows
for data in rootArray
let subArray = data as? NSArray ?? []
print(subArray.count)//Gives you subarray count
for value in subArray
print("objects are \(value)")//Gives you contains of subarray
【讨论】:
【参考方案3】:struct ParsePlist
let plistName:String
init(name:String)
plistName = name
func sectionArrayFromPlist() -> [[Any]]?
guard let plistPath = Bundle.main.path(forResource: plistName, ofType: "plist") else
return nil
guard let rootArray = NSArray(contentsOfFile: plistPath) as? [Any] else
return nil
var sectionArray:[[Any]]?
sectionArray = rootArray.flatMap( $0 as? [Any])
return sectionArray
使用:
let parsePlist = ParsePlist(name: <yourplistname>)
if let sectionArray = parsePlist.sectionArrayFromPlist()
// use sectionArray
【讨论】:
【参考方案4】:我猜你在数据结构上犯了一个错误。也许你可以试试下面的代码......
var mainGroup = [[Any]]()
var myArray: [[Any]]?
if let path = Bundle.main.path(forResource: "items", ofType: "plist")
myArray = NSArray(contentsOfFile: path)
if let myArr = myArray
mainGroup = myArr
【讨论】:
这段代码会做什么?允许我访问根数组中的数组吗? 1. plist 不是字符串数组的数组。 2. 不要不必要地强制解包选项。 您应该修正或删除答案。 还有其他问题吗?以上是关于Swift:如何在 plist 的数组中读取多个数组?的主要内容,如果未能解决你的问题,请参考以下文章
Swift 中的 Array 扩展以使用 NSPropertyListReadOptions 从 plist 中读取数组