2017-10-21 93 views
0

J'ai Workout classe Difficulty propriétéComment trier les objets par leur valeur enum?

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

class Workout { 
    var name: String? 
    var difficulty: Difficulty? 
    . 
    . 
    . 
} 

Je voudrais trier un tableau de séances d'entraînement par la propriété difficulté. Je sais que je peux y parvenir en attribuant la valeur brute de ENUM à la valeur Int et comparer ces valeurs comme suit:

data.sort { $0.workout.difficulty!.rawValue < $1.workout.difficulty!.rawValue } 

Mais je veux vraiment ce ENUM à chaîne de magasin, car il est commode de l'assigner au texte étiqueter la ligne sans vilains casse-case, et être comparable d'une manière ou d'une autre.

Comment y parvenir?

+0

Vous pouvez utiliser votre énumération hashValue. Btw Vous devriez utiliser une structure au lieu d'une classe. Et comme ce qui a été suggéré par Igor, vous pourriez rendre votre structure comparable au lieu de rendre l'énumération comparable. –

+0

Btw définir une valeur de chaîne à la même que la valeur de l'énumération est redondant –

+0

@LeoDabus merci pour votre suggestion, pourriez-vous donner un exemple complet en tant que réponse? – DCDC

Répondre

0

Vous pouvez utiliser votre énumération pour valeur de hachage trier Workouts. Vous devriez utiliser une structure à la place d'une classe et similaire à ce qui a été suggéré par Igor vous pourriez rendre votre structure comparable à celle de l'énumération:

struct Workout: Comparable { 
    let name: String 
    let difficulty: Difficulty 
    enum Difficulty: String { 
     case easy, moderate, hard 
    } 
    static func ==(lhs: Workout, rhs: Workout) -> Bool { 
     return lhs.difficulty.hashValue == rhs.difficulty.hashValue 
    } 
    static func <(lhs: Workout, rhs: Workout) -> Bool { 
     return lhs.difficulty.hashValue < rhs.difficulty.hashValue 
    } 
} 

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}] 
1

Implémentez le protocole Comparable sur votre enum. Il vous donne une méthode static func < (lhs: Difficulty, rhs: Difficulty) -> Bool où vous définissez le tri.

Voici un échantillon complet en utilisant une propriété pour simplifier la commande

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 
    } 
} 

Permettant d'utiliser

data.sort { $0.workout.difficulty! < $1.workout.difficulty! } 
+0

pourriez-vous fournir l'exemple complet? – DCDC