Лучшая практика - сортировка смешанных объектов в Swift - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь отсортировать массив различных объектов NSManagedObject в Swift.В Objective-C потребовалось бы всего 2 строки кода (дескриптор сортировки и фактическая сортировка).Тем не менее, единственный способ, которым я мог понять, как это сделать быстро, потребовал нескольких строк кода.Есть ли лучший и / или более быстрый способ, чем код, который я написал, пожалуйста?:

var orderMOs = [NSManagedObject]()
orderMOs.append(contentsOf: incidentMOs)
orderMOs.append(contentsOf: transferMOs)

orderMOs.sort (by: {(leftMO, rightMO) -> Bool in

   var leftDate: NSDate?
   var rightDate: NSDate?

   if leftMO is Incident {leftDate = (leftMO as! Incident).createdDate}
   else if leftMO is Transfer {leftDate = (leftMO as! Transfer).createdDate}

   if rightMO is Incident {rightDate = (rightMO as! Incident).createdDate}
   else if rightMO is Transfer {rightDate = (rightMO as! Transfer).createdDate}

   if leftDate == nil || rightDate == nil {return true}

   return leftDate!.compare(rightDate! as Date) == .orderedDescending
})

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Почему бы не использовать KVC здесь?

if let leftDate = leftMO.value(forKey: "createdDate") as? Date, 
   let rightDate = rightMO.value(forKey: "createdDate") as? Date {

    if leftDate == nil || rightDate == nil {return true}
    return leftDate.compare(rightDate) == . orderedDescending
}
0 голосов
/ 01 июня 2018

Вы должны оба ваших класса соответствовать протоколу, который объявляет createdDate.Введите orderMOs как таковой.чем вам не понадобятся условные приведения.

import Foundation

class A {

    init(created createdDate: Date) {
        self.createdDate = createdDate
    }
    let createdDate: Date
}


class B {
    init(created createdDate: Date) {
        self.createdDate = createdDate
    }
    var createdDate: Date
}

protocol Created {
    var createdDate: Date { get }
}


extension A: Created {}
extension B: Created {}

func createDate(year: Int, month: Int, day: Int) -> Date {
    var comps = DateComponents()
    comps.year = year
    comps.month = month
    comps.day = day
    return Calendar.current.date(from: comps)!
}


var objects = [Created]()

objects.append(A(created: createDate(year: 2018, month: 2, day: 1)))
objects.append(B(created: createDate(year: 2017, month: 12, day: 1)))
objects.append(B(created: createDate(year: 2018, month: 5, day: 18)))
objects.append(A(created: Date()))

Сортируйте как

objects.sort { (c1, c2) -> Bool in
    return c1.createdDate < c2.createdDate
}

Еще одна вещь, которую вы можете сделать, это использовать оператор switch с шаблоном соответствие , чтобы немного очистить код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...