Friday 15 June 2012

sorting - How do I sort Swift objects by multiple criteria -



sorting - How do I sort Swift objects by multiple criteria -

i have list of swift objects i'd sorted multiple criteria. objects in list of type daterange:

class daterange { var from: nsdate? var to: nsdate? }

the list contains many of these objects from or to fields nil. want have list sorted by:

first objects have dates then objects have @ to the lowest degree 1 date (either from or to) and @ end objects without any

the dates don't matter, existence. in ruby (if date nil set low date):

date_ranges.sort { |a, b| [fix_nil(a.from), fix_nil(a.to)] <=> [fix_nil(b.from), fix_nil(b.to)] }.reverse def fix_nil(val) val.nil? ? date.new(0) : val end

what's best way swift? in advance.

seems might thought add together datecount computed property daterange type. time pattern matching:

extension daterange { // returns number of non-nil nsdate members in 'from' , 'to' var datecount: int { switch (from, to) { case (nil, nil): homecoming 0 case (nil, _): homecoming 1 case (_, nil): homecoming 1 default: homecoming 2 } } }

then can sort list simple closure:

var ranges = [daterange(nil, nil), daterange(nsdate(), nil), daterange(nil, nsdate()), daterange(nil, nil), daterange(nsdate(), nsdate())] ranges.sort { $0.datecount > $1.datecount }

if wanted, create comparable few more lines:

extension daterange : comparable { } func ==(lhs: daterange, rhs: daterange) -> bool { homecoming lhs.datecount == rhs.datecount } func <(lhs: daterange, rhs: daterange) -> bool { homecoming lhs.datecount > rhs.datecount }

this lets sort list operator argument:

ranges.sort(<)

sorting swift

No comments:

Post a Comment