Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //: Playground - noun: a place where people can play
- import Foundation
- // Constraining the Element to NSObject makes sure that NSSortDescriptors can be used for comparison.
- extension Collection where Iterator.Element: NSObject {
- func sorted(using descriptors: [NSSortDescriptor]) -> [Iterator.Element] {
- return self.sorted { (element1, element2) in
- for descrptor in descriptors {
- let compareResult = descrptor.compare(element1, to: element2)
- switch compareResult {
- case .orderedSame: continue
- case .orderedAscending: return true
- case .orderedDescending: return false
- }
- }
- return false
- }
- }
- }
- // Can be sorted with extended Collection sorted(using:) function.
- class Thing: NSObject {
- let id: Int
- let name: String
- init(id: Int, name: String) {
- self.id = id
- self.name = name
- super.init()
- }
- override var description: String {
- return "\(id): " + self.name
- }
- }
- // Can't be sorted with extended Collection sorted(using:) function.
- class Foo: Hashable {
- let id: Int
- let name: String
- init(id: Int, name: String) {
- self.id = id
- self.name = name
- }
- var hashValue: Int {
- return id
- }
- }
- func ==(lhs: Foo, rhs: Foo) -> Bool {
- return lhs.id == rhs.id
- }
- var mySet: Set<Thing> = [Thing(id: 10, name: "Ten"), Thing(id: 1, name: "One"), Thing(id: 1, name: "AOne"), Thing(id: 2, name: "Two"), Thing(id: 4, name: "Four"), Thing(id: 3, name: "Three")]
- // compiler won't offer sorted(using: [NSSortDescriptor]) since this Array type isn't NSObject.
- var fooSet: Set<Foo> = [Foo(id: 10, name: "ten"), Foo(id: 1, name: "one")]
- let sorts = [NSSortDescriptor(key: "id", ascending: true), NSSortDescriptor(key: "name", ascending: true)]
- var sorted = mySet.sorted(using: sorts)
- print(sorted)
- // [1: AOne, 1: One, 2: Two, 3: Three, 4: Four, 10: Ten]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement