首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >表视图中的动态区段排序

表视图中的动态区段排序
EN

Stack Overflow用户
提问于 2021-11-03 18:32:18
回答 1查看 55关注 0票数 1

如何对从datestamp字段动态生成的以下部分进行排序?例如,名为2021-11-3的部分需要显示在2021-11-2上面的表视图中。

日期戳格式: 2021-11-3

代码语言:javascript
运行
复制
var sections = [mySections]()
var structure = [myStructure]()

private func fetchJSON() {
    
    guard let url = URL(string: "test.com")
    else { return }
    
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.httpBody = "id=\1".data(using: .utf8)
    

URLSession.shared.dataTask(with: request) { data, _, error in
guard let data = data else { return }
                
do {
  let decoder = JSONDecoder()
  self.structure.sort { $0. datestamp > $1.datestamp }
  let res = try decoder.decode([myStructure].self, from: data)
  let grouped = Dictionary(grouping: res, by: { $0. datestamp })
  let keys = grouped.keys.sorted()
self.sections = keys.map({mySections(date: $0, items: grouped[$0]!
                    
)})
  DispatchQueue.main.async {
  self.tableView.reloadData()
}
        }
        
        catch {
            print(error)
        }
    }.resume()
 }

我尝试过在self.sections下执行以下操作,但它什么也不做:

代码语言:javascript
运行
复制
self.sections.sorted { $0.date > $1.date }

结构:

代码语言:javascript
运行
复制
struct mySections {
    let date : String
    var items : [myStructure]
}


struct myStructure: Decodable {
    
    let recordid: Int
    let testname: Int
    let datestamp: String
}

数据示例:

代码语言:javascript
运行
复制
[
  { 
    "recordid": 1,
    "testname": "Jen",
    "datestamp": "2021-11-3"
  },
  {
    "recordid": 1,
    "testname": "Jake",
    "datestamp": "2021-11-2"
  }
]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-03 19:28:28

现在,您正在基于structuredateTimeStamp进行排序,因为structure中没有任何数据。

在我的操场示例中,就像您的代码一样,我使用了Dictionary(grouped:)。然后,我通过map将这些结果传递给mySectionssort

最后,print的结果是:

"2021-11-4“、"2021-11-3”、"2021-11-2“

代码语言:javascript
运行
复制
let data = """
[
  {
    "recordid": 1,
    "testname": "Jake",
    "datestamp": "2021-11-2"
  },
  {
    "recordid": 2,
    "testname": "Jen",
    "datestamp": "2021-11-3"
  },
      {
        "recordid": 3,
        "testname": "Bob",
        "datestamp": "2021-11-3"
      },
      {
        "recordid": 4,
        "testname": "Bill",
        "datestamp": "2021-11-4"
      }
]
""".data(using: .utf8)!

struct mySections {
    let date : String
    var items : [myStructure]
}


struct myStructure: Decodable {
    let recordid: Int
    let testname: String
    let datestamp: String
}

var sections = [mySections]()
var structure = [myStructure]()

do {
    let decoder = JSONDecoder()
    let res = try decoder.decode([myStructure].self, from: data)
    let grouped = Dictionary(grouping: res, by: { $0.datestamp })
    sections = grouped.map { mySections(date: $0.key, items: $0.value) }
        .sorted { $0.date > $1.date }
    print(sections.map(\.date))
} catch {
    print(error)
}

值得注意的是,现在您的日期是以统一格式存储的,这种格式对于基于字符串的排序非常有效。但是,如果端点返回格式不一致的日期(如2021-11-042021-11-3),则需要首先转换为实际的Date,并根据此进行排序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69830045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档