根据 属性? 组织数组中的对象

Organize objects in an array depending on their property?

如何根据 属性 组织对象数组?例如,假设我有这个:

import UIKit
import SpriteKit

struct Person {

    let name : String!
    let age : Int!
    let charcter : characterType!

    enum characterType {
        case happy, sad, mad, scared, excited
    }
}

let people : [Person] = [

    Person(name: "Bob", age: 10, charcter: Person.characterType.happy),
    Person(name: "Joe", age: 45, charcter: Person.characterType.sad),
    Person(name: "Tom", age: 105, charcter: Person.characterType.scared),
    Person(name: "Mad", age: 3, charcter: Person.characterType.mad)

]

如何根据 character type 组织 people 数组? 我希望所有生气的人都先是,然后是快乐,然后是悲伤,然后是害怕。

我该怎么做? var newArray : [Person] ...

还有一件事我已经尝试过以下方法:

   func organizeArray(){

    var newArray = [Person]()

    var array1 = []
    var array2 = []
    var array3 = []
    var array4 = []
    var array5 = []

    for person in people {
        switch person.charcter {
            case happy...
                append to array 1
            case mad...
            append to array 2

so on...

        }

    }
    newArray = array1 + array2 + array3 + array4 + array5
}

但是当我 运行 这需要 XCode 永远索引。如果我删除此功能,一切正常。我想要一个简单的解决方案,并且不会导致 XCode 永远索引(很多)。

你在做什么,是为每种字符类型创建一个单独的数组,然后将它们连接在一起。这效率不高。正如 the-paramagnetic-croissant 所建议的那样,您应该使用 swift 数组的排序功能,并结合以这种方式将原始值关联到枚举类型的可能性:

struct Person {
    let name : String
    let age : Int
    let charcter : characterType

    enum characterType: Int {
       case mad = 0, happy, sad, scared, excited
   }
}

let people : [Person] = [
    Person(name: "Bob", age: 10, charcter: Person.characterType.happy),
    Person(name: "Joe", age: 45, charcter: Person.characterType.sad),
    Person(name: "Tom", age: 105, charcter: Person.characterType.scared),
    Person(name: "Mad", age: 3, charcter: Person.characterType.mad) 
]

let newArray = people.sorted { [=10=].charcter.rawValue < .charcter.rawValue }

println(newArray[0].charcter.rawValue) // Mad
println(newArray[1].charcter.rawValue) // Happy
println(newArray[2].charcter.rawValue) // Sad
println(newArray[3].charcter.rawValue) // Scared