Swift: Sort Array por tipo de descriptores

Estoy usando conetworkingata, así que necesito orderar los descriptores para mis entidades.

Por ejemplo, una entidad de coorderadas tiene esta class func:

class func sortDescriptors() -> Array<NSSortDescriptor> { return [NSSortDescriptor(key: "sequence", ascending: true)] } 

Estoy usando esto cuando hago requestes de búsqueda a CoreData así:

 var request = NSFetchRequest(entityName: entityName) request.sortDescriptors = T.sortDescriptors() 

Sin embargo, cuando tengo una matriz de coorderadas como una propiedad en otro object de conetworkingata, este es un NSSet (es decir, sin clasificar)

Para resolver esto, estoy devolviendo las coorderadas así:

 return NSArray(array: coordinates!).sortedArrayUsingDescriptors(Coordinate.sortDescriptors()) as? Array<Coordinate> 

Lo que se siente feo, usar un NSArray solo para get el método sortedArrayUsingDescriptors . ¿Hay una manera similar de hacer esto directamente en una matriz Swift, Ie Array<Coordinate> usando los descriptores de orderación?

¡Gracias!

No hay un método incorporado para esto, pero puedes agregarlos usando la extensión de protocolo:

 extension MutableCollectionType where Index : RandomAccessIndexType, Generator.Element : AnyObject { /// Sort `self` in-place using criteria stonetworking in a NSSortDescriptors array public mutating func sortInPlace(sortDescriptors theSortDescs: [NSSortDescriptor]) { sortInPlace { for sortDesc in theSortDescs { switch sortDesc.compareObject($0, toObject: $1) { case .OrdenetworkingAscending: return true case .OrdenetworkingDescending: return false case .OrdenetworkingSame: continue } } return false } } } extension SequenceType where Generator.Element : AnyObject { /// Return an `Array` containing the sorted elements of `source` /// using criteria stonetworking in a NSSortDescriptors array. @warn_unused_result public func sort(sortDescriptors theSortDescs: [NSSortDescriptor]) -> [Self.Generator.Element] { return sort { for sortDesc in theSortDescs { switch sortDesc.compareObject($0, toObject: $1) { case .OrdenetworkingAscending: return true case .OrdenetworkingDescending: return false case .OrdenetworkingSame: continue } } return false } } } 

Pero tenga en count que esto solo funcionará cuando los elementos de la matriz sean classs, no estructuras, ya que el método NSSortDescriptor compareObject requiere arguments que se ajusten a AnyObject

Otro acercamiento a las buenas extensiones de Damien podría ser un molde múltiple.

 myArray = (myArray as NSArray).sortedArrayUsingDescriptors(tableView.sortDescriptors) as! Array 

Fuente original: NSHipster

Swift 3 Versión de la respuesta de @ Darniel

 extension MutableCollection where Self : RandomAccessCollection { /// Sort `self` in-place using criteria stonetworking in a NSSortDescriptors array public mutating func sort(sortDescriptors theSortDescs: [NSSortDescriptor]) { sort { by: for sortDesc in theSortDescs { switch sortDesc.compare($0, to: $1) { case .ordenetworkingAscending: return true case .ordenetworkingDescending: return false case .ordenetworkingSame: continue } } return false } } } extension Sequence where Iterator.Element : AnyObject { /// Return an `Array` containing the sorted elements of `source` /// using criteria stonetworking in a NSSortDescriptors array. public func sorted(sortDescriptors theSortDescs: [NSSortDescriptor]) -> [Self.Iterator.Element] { return sorted { for sortDesc in theSortDescs { switch sortDesc.compare($0, to: $1) { case .ordenetworkingAscending: return true case .ordenetworkingDescending: return false case .ordenetworkingSame: continue } } return false } } }