2015-10-18 17 views
-1

我有一個數組,看起來像這樣排序陣列由最後一個對象

[[AAA,BBB,CCC,3], 
[DDD,EEE,FFF,1], 
[GGG,HHH,III,2]] 

我用下面的目標C代碼通過在每個柱部件的最後一個值對數組進行排序:

NSSortDescriptor *aSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"@lastObject"                   ascending:YES                   comparator:^(id obj1, id obj2) { 
       if ([obj1 integerValue] > [obj2 integerValue]) { 
        return (NSComparisonResult)NSOrderedDescending; 
       } 
       if ([obj1 integerValue] < [obj2 integerValue]) { 
        return (NSComparisonResult)NSOrderedAscending; 
       } 
       return (NSComparisonResult)NSOrderedSame; 
      }]; 

listNavData = [NSMutableArray arrayWithArray:[listNavDataUnsorted sortedArrayUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]]]; 

我該如何在Swift中做到這一點?我試圖將代碼轉換成Swift,但失敗了。在Swift中,根據數組組件中的最後一個組件對數組進行排序是否有很好的方法,以便我有以下幾點?

[[DDD,EEE,FFF,1], 
    [GGG,HHH,III,2], 
    [AAA,BBB,CCC,3]] 
+0

對不起。它應該是一個數組數組。糾正。感謝您的注意, –

回答

2

大廈關閉的@在解釋這個問題MattLewin的偵查工作,這裏是一個使用數組的sort()方法雨燕版本:

let listNavDataUnsorted = [ 
    ["AAA", "BBB", "CCC", 3], 
    ["DDD", "EEE", "FFF", 1], 
    ["GGG", "HHH", "III", 2] 
] 

let listNavDataSorted = listNavDataUnsorted.sort {($0.last as? Int) < ($1.last as? Int)} 

print(listNavDataSorted) // [[DDD, EEE, FFF, 1], [GGG, HHH, III, 2], [AAA, BBB, CCC, 3]] 

相反,如果你的最後一個項目是一個String,你想排序其整數值:

let listNavDataUnsorted = [ 
    ["AAA", "BBB", "CCC", "3"], 
    ["DDD", "EEE", "FFF", "111"], 
    ["GGG", "HHH", "III", "22"] 
] 

let listNavDataSorted = listNavDataUnsorted.sort {Int($0.last ?? "") < Int($1.last ?? "")} 

print(listNavDataSorted) // [["AAA", "BBB", "CCC", "3"], ["GGG", "HHH", "III", "22"], ["DDD", "EEE", "FFF", "111"]] 
+0

非常感謝!這正是我所期待的。 –

3

我不確定我完全理解你的「listNavDataUnsorted」陣列的結構,但下面的銀行代碼複製你與你的Objective-C代碼實現的功能。

let listNavDataUnsorted: NSArray = [ 
    ["AAA", "BBB", "CCC", 3], 
    ["DDD", "EEE", "FFF", 1], 
    ["GGG", "HHH", "III", 2] 
] 

func compare(obj1: AnyObject, obj2: AnyObject) -> NSComparisonResult { 
    if Int(obj1 as! NSNumber) > Int(obj2 as! NSNumber) { 
     return NSComparisonResult.OrderedDescending 
    } 
    else if Int(obj1 as! NSNumber) < Int(obj2 as! NSNumber) { 
     return NSComparisonResult.OrderedAscending 
    } 
    else { 
     return NSComparisonResult.OrderedSame 
    } 
} 

let sortDescriptor = NSSortDescriptor(key: "@lastObject", ascending: true, comparator: compare) 
let listNavDataSorted = listNavDataUnsorted.sortedArrayUsingDescriptors([sortDescriptor]) 

我懷疑有一個更好的方式使用內置陣列的sort(_:),但我還沒有想通了斯威夫特做到這一點。我還沒有弄清楚簡單在NSSortDescriptor()調用中包含compare函數的語法,雖然在Swift中這絕對是可能的。

+0

解釋這個問題很好。我使用Array的'sort()'方法提供了答案。 – vacawama

+0

謝謝你的回答! –

+0

@vacawama非常感謝您的誇獎。你的回答顯然是在Swift中做到的正確方法。真的很好。 –