【问题标题】:Sorting Struct array in Swift 4在 Swift 4 中对结构数组进行排序
【发布时间】:2021-08-04 05:45:38
【问题描述】:

我有以下struct 并希望按startTime 字段对会话中的项目进行排序。我完全不知道该怎么做。

我试过了:

let sortedArray = sessionsData?.items.sorted{ ($0["startTime"] as! String) < ($1["startTime"] as! String) }

但这只是给我一个关于没有下标成员的错误?

任何指点将不胜感激,谢谢。

public struct sessions: Decodable {
  let status: String?
  let start: Int?
  let count: Int?
  let items: [sessionInfo]?
  let itemsCount: Int?
  let multipart: Bool?
  let startTime: Int?
  let endTime: Int?
}


public struct sessionInfo: Decodable {
  let name: String?
  let datalist: String?
  let sessionType: Int?
  let status: Int?
  let backupType: Int?
  let startTime: Int?
  let endTime: Int?
  let owner: String?
  let numOfErrors: Int?
  let numOfWarnings: Int?
  let flags: Int?
}

我尝试了以下方法,但出现错误:

var sortedArray = sessionsData?.items?.sorted(by: { (lhs, rhs) -> Bool in
        return lhs.startTime < rhs.startTime
    })

错误:

Binary operator '<' cannot be applied to two 'Int?' operands

【问题讨论】:

  • 问题是默认情况下无法使用&lt;,&gt; 运算符比较选项。当startTimes 为nil 或将startTime 的类型更改为Int 时,请自行定义返回值。
  • 啊,谢谢你,大卫!
  • @FlatDog 所有可选字段都是一个很大的危险信号。您确定没有开始或结束时间、名称或其他任何内容的会话有意义吗?
  • 是的,我正在考虑改变这一点,谢谢@Alexander。
  • 自 Swift4(我认为)以来,比较选项不再可能。你可以这样写(在操场上测试): var sortedArray = sessionsData?.items?.sorted(by: { (lhs, rhs) -> Bool in return (lhs.startTime ?? 0)

标签: ios swift sorting comparator swift4


【解决方案1】:

试试下面的代码,它按 asc 顺序对结构进行排序,但会将 nil 时间戳推到底部。 如果您希望 nil 时间戳位于顶部,请在下面的代码中进行所有 nil 检查以返回与我在下面的代码中返回的相反。

var sortedArray = sessionsData?.items?.sorted(by: { (lhs, rhs) -> Bool in

if let lhsTime = lhs.startTime, let rhsTime = rhs.startTime {
    return lhs.startTime < rhs.startTime
}

if lhs.startTime == nil && rhs.startTime == nil {
    // return true to stay at top
    return false
}

if lhs.startTime == nil {
    // return true to stay at top
    return false
}

if rhs.startTime == nil {
    // return false to stay at top
    return true
}

})

【讨论】:

    【解决方案2】:

    你可以这样写(在操场上测试):

    var sortedArray = sessionsData?.items?.sorted(by: { (lhs, rhs) -> Bool in return (lhs.startTime ?? 0) < (rhs.startTime ?? 0) })
    

    如果一个是可选的,即使比较的结果没有意义,你也不会崩溃

    【讨论】:

      【解决方案3】:

      您应该直接访问这些字段,而不是通过下标。

      let sortedArray = sessionsData?.items.sorted(by: {$0.startTime < $1.startTime})
      

      【讨论】:

      • 对于那些赞成的人,请记住,此代码不会编译,因为 startTime 是可选的。
      猜你喜欢
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 2014-03-12
      相关资源
      最近更新 更多