Ios Swift 4中的排序结构数组

Ios Swift 4中的排序结构数组,ios,swift,sorting,comparator,swift4,Ios,Swift,Sorting,Comparator,Swift4,我得到了下面的struct,并希望按照startTime字段对会话中的项目进行排序。我完全不知道该怎么做 我试过: let sortedArray = sessionsData?.items.sorted{ ($0["startTime"] as! String) < ($1["startTime"] as! String) } 我尝试了以下操作,但出现错误: var sortedArray = sessionsData?.items?.sorted(by: { (lhs, rhs) -

我得到了下面的
struct
,并希望按照
startTime
字段对会话中的项目进行排序。我完全不知道该怎么做

我试过:

let sortedArray = sessionsData?.items.sorted{ ($0["startTime"] as! String) < ($1["startTime"] as! String) }
我尝试了以下操作,但出现错误:

var sortedArray = sessionsData?.items?.sorted(by: { (lhs, rhs) -> Bool in
        return lhs.startTime < rhs.startTime
    })
var sortedArray=sessionsData?.items?.sorted(按:{(lhs,rhs)->布尔输入)
返回左S.startTime<右S.startTime
})
错误:

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

二进制运算符'您应该直接访问字段,而不是通过下标

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

尝试下面的代码,它按asc顺序对结构进行排序,但将零时间戳推到底部。 如果希望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
}

})
var sortedArray=sessionsData?.items?.sorted(按:{(lhs,rhs)->布尔输入)
如果让lhtime=lhs.startTime,则让rhtime=rhs.startTime{
返回左S.startTime<右S.startTime
}
如果lhs.startTime==nil&&rhs.startTime==nil{
//返回true以保持在顶部
返回错误
}
如果lhs.startTime==nil{
//返回true以保持在顶部
返回错误
}
如果rhs.startTime==nil{
//返回false以保持在顶部
返回真值
}
})
您可以编写以下内容(在操场上测试):

var sortedArray=sessionsData?.items?.sorted(按:{(lhs,rhs)->返回布尔值(lhs.startTime??0)<(rhs.startTime??0)})

如果其中一个选项是可选的,则不会崩溃,即使比较结果毫无意义

问题在于,默认情况下,无法使用
运算符对选项进行比较。如果
startTime
s中的任何一个或两个
startTime
均为
nil
,请自行定义返回值,或者将
startTime
的类型更改为
Int
。啊,谢谢你,大卫@FlatDog所有可选字段都是一个相当大的红旗。你确定一个会话没有开始或结束时间、名称或其他任何东西是有意义的吗?是的,我正在考虑改变这一点,谢谢@Alexander。因为Swift4(我认为),比较选项是不可能的。您可以编写以下内容(在操场中测试):var sortedArray=sessionsData?.items?.sorted(按:{(lhs,rhs)->Bool作为回报(lhs.startTime??0)<(rhs.startTime??0)}。如果其中一个是可选的,则不会崩溃,即使比较结果对于那些升级投票来说没有意义,请记住,由于
startTime
是可选的,所以此代码不会编译。
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
}

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