【问题标题】:sort array of multiple inheritance objects by date按日期对多个继承对象的数组进行排序
【发布时间】:2015-09-27 12:16:50
【问题描述】:

我有一个数组array: [AnyObject],其中包含许多不同的继承对象,例如DogCat。我想按日期对这些进行排序,我该怎么做?

例如,这些类可能看起来像这样

class Pet {
    var: NSDate = NSDate()
}

class Dog: Pet {
}

class Cat: Pet {
}

到目前为止,我已经创建了这个类,假设它处理排序并返回一个带有排序对象的新数组

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


        let sortedArray = orgArray.sort {

        }



        return sortedArray

    }
}

【问题讨论】:

  • 数组只能包含Pet的子类吗?
  • 你的权利它只能包含 Pet 的子类

标签: ios arrays swift sorting


【解决方案1】:

试试这个:

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

【讨论】:

  • 当你做到了! [Pet] 然后我可以访问 Dog 和 Cat 类的特定属性吗?
  • 所以我可以改成func sortContentByDate(array:[Pet]) -> [Pet] {
  • 是的,那么你不需要这种类型转换。
  • 这是我回答的复制粘贴。您甚至没有更改参数名称。
【解决方案2】:
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]"

【讨论】:

  • 只是一些整理建议:$0$1 不能代替 $0.0$0.1 工作吗?如果您将签名更改为采用[Pet] 并返回[Pet],您可以摆脱强制转换。 NSComparisonResult 可以被 Swift 推断出来并忽略。
  • @vacawama 我只是将其保留为 AnyObject 以使其类似于 OP 问题。很明显我可以使用[宠物]
  • 是的。发表评论后,我认为这就是原因。建议 OP 使用 [Pet] 可能是一个好主意,因为如果传递了其他任何内容,它将崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 2011-10-30
  • 2015-02-25
  • 2013-10-26
相关资源
最近更新 更多