2014-10-30 69 views
-1

我试图排序自定义对象的数组。当一个数组包含一个对象时,它将使用一个对象返回排序的数组。但是,如果一个数组包含多个对象,坠毁快速排序自定义对象的NSMutableArray

class Plans:NSObject{ 
    var price:Int 

    var name:String? 
    .. 
    .. 
    .. 
} 


func price(array:NSMutableArray,sortKey:NSString)->Int{ 
     var sortDescriptor:NSSortDescriptor = NSSortDescriptor(key: sortKey, ascending: true) 
     var sortedArray:NSArray = array.sortedArrayUsingDescriptors([sortDescriptor])//Crashes 
     var apt:Plans = sortedArray.objectAtIndex(0) as Plans 
     return apt.price 
} 

函数调用:

self.price(array,sortKey:"price") //array contains array of Plans objects 

崩溃:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<pjct.Plans 0x7fb8a7bb7af0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key price.' 
+0

你的代码实际上适用于我。您正在使用哪个版本的xcode?你是如何初始化'array'变量的? – 2014-10-30 10:29:48

+0

我正在使用Xcode 6.1。我将json响应映射到数组中,并尝试按价格对数组进行排序 – 2014-10-30 10:40:03

+0

该数组很有可能不包含任何“Plans”类型的对象。您应该向我们展示用于将json响应转换为数组的代码。 – 2014-10-30 10:47:52

回答

3

首先要Plans类实现的ComparableEquatable。这里是如何:

extension Plans: Comparable {} 
extension Plans: Equatable {} 

然后实现两个功能:

func ==(lhs: Plans, rhs: Plans) -> Bool { 
    return lhs.price == rhs.price 
} 

func <(lhs: Plans, rhs: Plans) -> Bool { 
    return lhs.price < rhs.price 
} 

现在你可以使用标准的运营商排序的阵列。下面是如何

let sortedArray = (objcArray as AnyObject as [Plans]).sorted(<) 

或者,如果你不想实现这个协议,你可以简单地排序数组是这样的:

let sortedArray = (objcArray as AnyObject as [Plans]).sorted {$0.price < $1.price} 
+0

我得到NSMutableArray没有一个名为sort的成员 – 2014-10-30 10:37:40

+0

将它转换为'Array ' – mustafa 2014-10-30 10:39:35

+0

我该如何施放。我试过这个。 (计划阵列为).sort(<)。我得到一个错误为“不可变的值类型数组只有变异成员排序” – 2014-10-30 10:43:26

1

确定。最后我能弄清楚这个问题。我无法对包含Int值的数组进行排序。所以我改变了 “价格” 从INT到的NSNumber

var price:Int 

var price:NSNumber 

现在它的工作原理。

+1

我可以知道为什么它被拒绝投票吗? – 2014-10-30 12:05:48