2014-10-30 78 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