Сортировка массива PFObject

Я использую Parse, и у меня есть массив PFObjects, который называется «scorecardData». Каждый PFObject имеет свойство «оценка» типа Int. Я пытаюсь отсортировать свой массив по «оценке», но получаю следующую ошибку: «Двоичный оператор '‹' нельзя применить к двум 'AnyObject?' операнды». Я не уверен, что я делаю неправильно здесь. Я также пробовал использовать objectForKey("score") как! Int, но это не позволяет мне сделать это. Какие-либо предложения? Заранее спасибо.

    var scorecardData = [PFObject]()

    scorecardData.sortInPlace({$0.objectForKey("score") < $1.objectForKey("score")})

person dcotter    schedule 22.11.2015    source источник


Ответы (3)


Вы объявили переменную scorecardData как массив PFObject. Почему вы пытаетесь получить доступ к свойству PFObject, используя objectForKey: зарезервировано? Во всяком случае, я не специалист по разбору. Но если вы объявили свой массив как [PFObject], вы можете использовать:

scorecardData.sortInPlace({$0.score < $1.score})

Но это не сработает, если вы не подклассируете PFObject для более естественной объектно-ориентированной структуры классов. Если вы это сделаете, не забудьте также указать:

var scorecardData = [YOUR_NEW_CLASS]()

Я настоятельно рекомендую создавать подклассы PFObject, чтобы использовать все возможности быстрой безопасности типов.

Но если вы хотите сохранить свою структуру данных, вы можете использовать:

scorecardData.sortInPlace({($0["score"] as! Int) < ($1["score"] as! Int)})

Имейте в виду, что это опасно, и в будущем избегайте этого.

person zuziaka    schedule 22.11.2015
comment
Спасибо zuzika! Ваше решение сработало. Я все еще новичок в программировании и рассмотрю возможность создания подклассов PFObject для этого проекта, чтобы сделать мой код лучше. - person dcotter; 23.11.2015

Если вы хотите отсортировать свой массив PFOject... Вы можете сделать это

extension Array where Element:PFObject {
    func sort() -> [PFObject] {
        return sort { (first, second) -> Bool in
            let firstDate   = first.objectForKey("time") as! NSDate//objectForKey(Constants.Parse.Fields.User.fullName) as? String
            let secondDate  = second.objectForKey("time") as! NSDate//objectForKey(Constants.Parse.Fields.User.fullName) as? String
            return firstDate.compare(secondDate) == .OrderedAscending
        }
    }
}
person Waqas Ali    schedule 22.03.2017

Вы пробовали это сделать?

var query = PFQuery(className:"ScoreCard")

    // Sorts the results in ascending order by the score field
query.orderByDescending("score")

query.findObjectsInBackgroundWithBlock {
person dannybess    schedule 22.11.2015