2016-05-07 2 views
-1

массива содержит экземпляр Entity (Graph библиотеки для Core Data):Swift массив сортировать по 2 параметрам

let timCook = Entity(type: "Employees") 
timCook["name"] = "Tim Cook" 
timCook["company"] = "Apple" 

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

self.storage.sortInPlace ({ ($0["company"] as? String) < ($1["company"] as? String) 
          && ($0["name"] as? String) < ($1["name"] as? String) 
         }) 

благодаря

+0

Каково ожидаемое поведение? Как сортировать массив? – Palle

+0

сначала фирмой, а затем по имени: Apple Phil Schiller -> Apple Tim Cook -> Facebook Mark Zac -> Microsoft Nadella и т. Д. – Enlil

+0

почему -1? Мне просто нужно знать, возможно ли это и что такое правильный синтаксис .... – Enlil

ответ

0

Хорошо, если вы хотите отсортировать по компании первым, а затем по имени, вы должны сначала проверить равенство й компаний. Если компании одинаковы, вы возвращаетесь к сортировке по имени, иначе вы просто возвращаете результат сравнения между двумя компаниями.

self.storage.sortInPlace { 
    if ($0["company"] as! String) == ($1["company"] as! String) 
    { 
     return ($0["name"] as! String) < ($1["name"] as! String) 
    } 
    return $0["company"] as! String) < ($1["company"] as! String) 
} 

или еще короче:

self.storage.sortInPlace { (($0["company"] as! String) == ($1["company"] as! String)) ? (($0["name"] as! String) < ($1["name"] as! String)) : ($0["company"] as! String) < ($1["company"] as! String)) } 
+0

Это работает, не жалуйтесь! потому что это не вопрос, о котором мы говорим, и я уверен, что это String (посмотрите на Graph, чтобы узнать больше) – Enlil

+0

@MarcelloCatelli Независимо от того, что плавает ваша лодка. Не ожидайте, что игнорирование передового опыта поможет вам нанять. –

+0

@TimVermeulen Я знаю, что это нехорошо, но если вы посмотрите на библиотеку Графа, вы увидите, что я имею в виду ... – Enlil

4

Не используйте as! так много. Собственно, не используйте его вообще. Если вы уверены, что это значение существует, вы должны выбрать другой тип данных, чем словарь.

struct Storage { 
    let company: String 
    let name: String 
} 

var storage: [Storage] 

// fill storage with objects 

storage.sortInPlace { 
    if $0.company == $1.company { return $0.name < $1.name } 
    return $0.company < $1.company 
} 
+0

Значит, они не всегда Струны. Тип возврата - это фактически AnyObject, и поэтому вы должны использовать его как ?. Объектами в Графе являются стиль NoSQL, а это означает, что не все экземпляры могут иметь значение свойства. Так что, используя как! вы мысленно уверяете себя, что ценности существуют, но приложение не гарантирует, что оно существует, если только в другом месте вы этого не делаете, что фактически создает связь. Если вы хотите использовать подход Struct, создайте класс-оболочку вокруг объекта Entity, который обрабатывает дополнительные опции и такие для вас :) – CosmicMind

Смежные вопросы