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) })