如何按枚举值对对象进行排序?

DCD*_*CDC 6 swift

我上了财产WorkoutDifficulty

enum Difficulty: String {
  case easy = "easy"
  case moderate = "moderate"
  case hard = "hard"
}

class Workout {
  var name: String?
  var difficulty: Difficulty?
  .
  .
  .
}
Run Code Online (Sandbox Code Playgroud)

我想通过难度属性对一系列训练进行排序.我知道我可以通过将枚举的原始值分配给Int值并将这些值比较如下来实现:

data.sort { $0.workout.difficulty!.rawValue < $1.workout.difficulty!.rawValue }
Run Code Online (Sandbox Code Playgroud)

但我真的希望这个枚举存储字符串,因为将它分配给标签文本很方便,没有丑陋的开关盒黑客,并且在某些方面具有可比性.

怎么实现呢?

Igo*_*man 18

Comparable在您的身上实施协议enum.它为您提供了static func < (lhs: Difficulty, rhs: Difficulty) -> Bool一种定义排序的方法.

以下是使用属性简化排序的完整示例

enum Difficulty: String, Comparable {
    case easy = "easy"
    case moderate = "moderate"
    case hard(String) = "hard"

    private var sortOrder: Int {
        switch self {
            case .easy:
                return 0
            case .moderate:
                return 1
            case .hard(_):
                return 2
        }
    }

     static func ==(lhs: Difficulty, rhs: Difficulty) -> Bool {
        return lhs.sortOrder == rhs.sortOrder
    }

    static func <(lhs: Difficulty, rhs: Difficulty) -> Bool {
       return lhs.sortOrder < rhs.sortOrder
    }
}
Run Code Online (Sandbox Code Playgroud)

使其成为可能

data.sort { $0.workout.difficulty! < $1.workout.difficulty! }
Run Code Online (Sandbox Code Playgroud)


Leo*_*bus 7

编辑/更新:Swift 5或更高版本

您可以将枚举RawValue类型更改为整数,并使用其rawValue对锻炼进行排序。顺便说一句,您应该使用结构而不是类,并且类似于Igor的建议,您可以使结构可比而不是枚举:

struct Workout {
    let name: String
    let difficulty: Difficulty
}
Run Code Online (Sandbox Code Playgroud)
extension Workout {
    enum Difficulty: Int {
        case easy, moderate, hard
    }
}
Run Code Online (Sandbox Code Playgroud)

extension Workout: Comparable {
    static func <(lhs: Workout, rhs: Workout) -> Bool {
        return lhs.difficulty.rawValue < rhs.difficulty.rawValue
    }
}
Run Code Online (Sandbox Code Playgroud)
let wk1 = Workout(name: "night", difficulty: .hard)
let wk2 = Workout(name: "morning", difficulty: .easy)
let wk3 = Workout(name: "afternoon", difficulty: .moderate)

let workouts = [wk1, wk2, wk3]  // [{name "night", hard}, {name "morning", easy}, {name "afternoon", moderate}]

let sorted = workouts.sorted()  // [{name "morning", easy}, {name "afternoon", moderate}, {name "night", hard}]
Run Code Online (Sandbox Code Playgroud)