2015-09-27 2 views
0

У меня есть массив array: [AnyObject], который содержит несколько различных объектов наследования, например Dog или Cat. Я хотел бы сортировать их по дате, как я могу это сделать?сортировать массив из нескольких объектов наследования по дате

Классы могут, например, выглядеть следующим образом

class Pet { 
    var: NSDate = NSDate() 
} 

class Dog: Pet { 
} 

class Cat: Pet { 
} 

До сих пор я создал этот класс, который предполагают, чтобы справиться с сортировкой и возвращает новый массив с объектами отсортированный

class FavoriteSorter { 
    func sortOrganizationsByDistanceFromLocation(orgArray:[AnyObject]) -> [AnyObject] { 


     let sortedArray = orgArray.sort { 

     } 



     return sortedArray 

    } 
} 
+0

Может массив содержит только подклассы 'Pet'? – sbooth

+0

ваше право, оно может ТОЛЬКО содержать подклассы Pet –

ответ

0

Попробуйте это:

class Pet { 
    var myDate = NSDate() 
    var title = String() 
} 

class Dog: Pet { 
} 

class Cat: Pet { 
} 


var dog1 = Dog() 
dog1.myDate = NSDate() 
dog1.title = "Dog 1" 

var dog2 = Dog() 
dog2.myDate = NSDate(timeIntervalSinceNow:NSTimeInterval(10)) 
dog2.title = "Dog 2" 

var cat1 = Cat() 
cat1.myDate = NSDate(timeIntervalSinceNow:NSTimeInterval(20)) 
cat1.title = "Cat 1" 

var cat2 = Cat() 
cat2.myDate = NSDate(timeIntervalSinceNow:NSTimeInterval(15)) 
cat2.title = "Cat 2" 

var arrayOfObjs = [cat1, cat2, dog1, dog2] 

// Sorting array 
func sortOrganizationsByDistanceFromLocation(array:[AnyObject]) -> [AnyObject] { 
    return array.sort{ ($0.0 as! Pet).myDate.compare(($0.1 as! Pet).myDate) == NSComparisonResult.OrderedAscending } 
} 

let sortedArray = sortOrganizationsByDistanceFromLocation(arrayOfObjs) as! [Pet] 

print(sortedArray[0].title); // Prints Dog 1 
print(sortedArray[1].title); // Prints Dog 2 
print(sortedArray[2].title); // Prints Cat 2 
print(sortedArray[3].title); // Prints Cat 1 
+0

Когда вы это сделаете! [Pet], я смогу получить доступ к определенным атрибутам из класса Dog и Cat? –

+0

Да, вы правы :) – Abhinav

+0

Так, например, я мог бы просто перейти на 'func sortContentByDate (array: [Pet]) -> [Pet] {' –

0
class FavoriteSorter { 
    func sortOrganizationsByDistanceFromLocation(array:[AnyObject]) -> [AnyObject] { 
     return array.sort{ ($0.0 as! Pet).date.compare(($0.1 as! Pet).date) == NSComparisonResult.OrderedAscending } 
    } 
} 

Как упомянуто vacawama, было бы лучше передать [Pet] вместо [AnyObject], чтобы избежать сбоя вашего приложения, если вы передадите другой тип объекта:

class FavoriteSorter { 
    func sortOrganizationsByDistanceFromLocation(array:[Pet]) -> [Pet] { 
     return array.sort{ $0.date.compare($1.date) == NSComparisonResult.OrderedDescending } 
    } 
} 

class Pet { 
    var date = NSDate() 
} 
class Dog: Pet { } 
class Cat: Pet { } 

let dog = Dog() 
let cat = Cat() 

let date01 = NSDate() 
let date02 = NSDate().dateByAddingTimeInterval(3600) 

dog.date = date01 
cat.date = date02 

let pets = [dog,cat] 
pets.description // "[Dog, Cat]" 

let sortedPets = FavoriteSorter().sortOrganizationsByDistanceFromLocation(pets) 
sortedPets.description // "[Cat, Dog]" 
+1

Только некоторые советы по выбору: не будут ли '$ 0' и' $ 1', а не '$ 0.0' и' $ 0,1'? Если вы измените подпись, чтобы взять '[Pet]' и вернуть '[Pet]', вы можете избавиться от принудительного каста. 'NSComparisonResult' может быть выведено Swift и остановлен. – vacawama

+0

@vacawama Я просто сохранил его как AnyObject, чтобы сделать его похожим на вопрос OP. Очевидно, что я могу использовать [Pet] –

+0

Да. Я понял, что это было причиной после того, как я прокомментировал это. Вероятно, неплохо предложить OP использовать [Pet], потому что он сработает, если что-нибудь еще будет передано. – vacawama

Смежные вопросы