2014-07-10 23 views
11

Tôi đã lấy một số dữ liệu JSON từ một API và bây giờ có một NSArray đầy đủ các đối tượng NSDictionary. Mỗi NSDictionary có một cặp khóa/giá trị của "name" và tôi muốn sắp xếp NSArray bằng cặp khóa/giá trị đó.Sắp xếp NSArray của các đối tượng NSDictionary trong Swift

Tôi đã thực hiện khá nhiều tìm kiếm nhưng không có giải pháp nào mà tôi gặp phải dường như hoạt động trong ngôn ngữ Swift mới và tôi không chắc liệu đó có phải là lỗi hay không ...

tôi đã thử:

var descriptor: NSSortDescriptor = NSSortDescriptor(key: "name", ascending: true) 
var sortedResults: NSArray = results.sortedArrayUsingDescriptors(NSSortDescriptor(key: "name", ascending: true)) 

Nhưng điều đó sẽ không biên dịch nêu rõ "NSSortDescriptor không chuyển đổi được [AnyObject]".

Bạn có lời khuyên nào không?

+2

đã đọc những gì các lỗi nói: nó hy vọng một mảng ... – slazyk

Trả lời

30

bạn phải vượt qua một loạt các mô tả loại (ngay cả khi nó chỉ có một):

var descriptor: NSSortDescriptor = NSSortDescriptor(key: "name", ascending: true) 
var sortedResults: NSArray = results.sortedArrayUsingDescriptors([descriptor]) 
+1

Sử dụng xcode 6.1 này mang lại cho tôi một 'Không thể chuyển đổi kiểu của biểu' $ T7? ? để nhập 'NSSortDescriptor' vì tôi đã định nghĩa NSArray như thế này var valores = NSMutableArray (contentOfFile: file) Bất kỳ lời khuyên nào? Mọi trợ giúp sẽ được chào đón nhiều nhất –

+0

Tuyệt vời! ví dụ duy nhất làm việc sau khi tìm kiếm trong 2 ngày! Cảm ơn rất nhiều. – RikiRiocma

+0

Nếu bạn có điều này trong Objective-C -> NSArray * array = [[dictionary allKeys] sortArrayUsingSelector: @selector (compare :)]; Có ai biết sự thay thế trong Swift không? – Markus

12

Thay vì làm điều này theo cách cũ, tại sao không nắm lấy mới? Kiểu mảng nhanh có cả hai phương thức sortsorted. Bạn có thể cung cấp một kết thúc như chức năng sắp xếp:

var sortedResults= results.sorted { 
    (dictOne, dictTwo) -> Bool in 
    // put your comparison logic here 
    return dictOne["name"]! > dictTwo["name"]! 
} 
+3

Ngoài ra, điều này có thể được thực hiện trên một dòng: 'var formattedResults = results.sorted {$ 0 [" name "]! > $ 1 ["tên"]! } ' –

+0

Nó thực sự có thể, nhưng tôi đoán OP là một chút mới để Swift, vì vậy tôi chọn cho một cú pháp đóng cửa tiết hơn! – ColinE

+0

Tôi thực sự mới với Swift và tôi đã thử điều này trước đó nhưng không thể làm cho nó hoạt động. Tôi nghĩ rằng tôi thấy những gì tôi bỏ lỡ mặc dù và sẽ cung cấp cho câu trả lời của bạn một shot sau này. Cảm ơn bạn! – jopeek

0
var arrDescriptor = NSSortDescriptor(key: "", ascending: true) 
    var sortDescriptors: NSArray = [arrDescriptor] 
    _sortedArray = allKeysArray.sortedArrayUsingDescriptors(sortDescriptors as [AnyObject]) 

    print(_sortedArray) 
Các vấn đề liên quan