【问题标题】:Swift: How to read multiple array within array in plist?Swift:如何在 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 中,要读取的数组不仅仅是根。我想在我的集合视图中读取根有多少个数组,我在numberOfItemsInSectioncellForItemAtdidSelectItemAt 中使用它。而且我还想读取数组中的项目,以便在选择项目时将其显示在集合的详细视图中。

结论:我想读取根数组中有多少个数组以在.count 中使用它,以及如何访问数组中的项目以将其作为详细信息显示在另一个视图控制器中。要访问一个数组,它将是 array[2] 但如果我想显示字符串 "Jeans" 和 "4" 等,那将如何工作。谢谢

【问题讨论】:

    标签: ios arrays swift plist


    【解决方案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. 不要不必要地强制解包选项。
        • 您应该修正或删除答案。
        • 还有其他问题吗?
        猜你喜欢
        • 1970-01-01
        • 2016-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多