0

我正在尝试对任何对象的数组进行排序,但无法做到这一点。我从 Parse 数据库中以 AnyObject 格式获取了一些数据。根据以下数据,我想按“NAME”对这个 AnyObject 数组进行排序。下面是我的代码 -

  let sortedArray = (myArray as! [AnyObject]).sorted(by: { (dictOne, dictTwo) -> Bool in
                                                            let d1 = dictOne["NAME"]! as AnyObject; // this line gives error "Ambiguous use of subscript"
                                                            let d2 = dictTwo["NAME"]! as AnyObject; // this line gives error "Ambiguous use of subscript"

                                                            return d1 < d2
                                                        })

myArray 看起来像这样 -

 {
            LINK = "www.xxx.com";
            MENU = Role;
            "MENU_ID" = 1;
            NAME = "A Name";
            SUBMENU = "XXX";
            "Training_ID" = 2;
        },
            {
            LINK = "www.xyz.com";
            MENU = Role;
            "MENU_ID" = 2;
            NAME = "B name";
            SUBMENU = "jhjh";
            "Training_ID" = 6;
        },
            {
            LINK = "www.hhh.com";
            MENU = Role;
            "MENU_ID" = 3;
            NAME = "T name";
            SUBMENU = "kasha";
            "Training_ID" = 7;
        },
            {
            LINK = "www.kadjk.com";
            MENU = Role;
            "MENU_ID" = 5;
            NAME = "V name";
            SUBMENU = "ksdj";
            "Training_ID" = 1;
        },
            {
            LINK = "www.ggg.com";
            MENU = Role;
            "MENU_ID" = 4;
            NAME = "K name";
            SUBMENU = "idiot";
            "Training_ID" = 8;
        },
            {
            LINK = "www.kkk.com";
            MENU = Role;
            "MENU_ID" = 6;
            NAME = "s name";
            SUBMENU = "BOM/ABOM/BSM";
            "Training_ID" = 12;
        }

任何帮助将非常感激。谢谢!

4

3 回答 3

3

它不是[AnyObject](我没有想法的数组),而是字典数组[[String:Any]]。更具体地说,这解决了错误。

在 Swift 3 中,编译器必须知道所有下标对象的具体类型。

let sortedArray = (myArray as! [[String:Any]]).sorted(by: { (dictOne, dictTwo) -> Bool in
                                         let d1 = dictOne["NAME"]! as String
                                         let d2 = dictTwo["NAME"]! as String

                                         return d1 < d2
                                     })
于 2017-02-14T17:11:50.677 回答
1

为什么将数组转换为[AnyObject]而不是将数组转换为方法[[String:Any]]并告诉编译器该数组包含为对象。ArrayDictionaryDictionary

if let array = myArray as? [[String:Any]] {
   let sortedArray = array.sorted(by: { $0["NAME"] as! String < $1["NAME"] as! String })
}

注意:在您的每个数组字典中都有带有值的键,我已经用下标强制将其包装起来NAMEString

于 2017-02-14T17:11:36.067 回答
1

如果需要,您可以使用以下功能

//function to sort requests
func sortRequests(dataToSort: [[String:Any]]) -> [[String:Any]] {
    print("i am sorting the requests...")
    var returnData = [[String:Any]]()
    returnData = dataToSort
    returnData.sort{
            let created_date0 = $0["date"] as? Double ?? 0.0
            let created_date1 = $1["date"] as? Double ?? 0.0
            return created_date0 > created_date1
    }
    return returnData
}
于 2018-10-02T00:16:31.593 回答