2017-10-19 1 views
0

J'essaie de remplir un UITableView avec un tableau d'éléments. Ces éléments sont struct:Accès enum à l'intérieur de la structure

public enum itemNumber { 
    case Item1 
    case Item2 
    case Item3 
    case Item4 
    case Item5 
    case Item6 
} 

public enum sectionNumber { 
    case Section1 
    case Section2 
    case Section3 
    case Section4 
} 

public struct Item { 
    var itemNumber: itemNumber? 
    var sectionNumber: sectionNumber? 
    var checkmark: Bool 

    init(sectionNumber: Int, itemNumber: Int, checkmark: Bool) { 
    switch sectionNumber { 
    case 0: self.sectionNumber = .Section1 
    case 1: self.sectionNumber = .Section2 
    case 2: self.sectionNumber = .Section3 
    case 3: self.sectionNumber = .Section4 
    default: break 
    } 
    switch itemNumber { 
    case 0: self.itemNumber = .Item1 
    case 1: self.itemNumber = .Item2 
    case 2: self.itemNumber = .Item3 
    case 3: self.itemNumber = .Item4 
    case 4: self.itemNumber = .Item5 
    case 5: self.itemNumber = .Item6 
    default: break 
    } 
    self.checkmark = checkmark 
    } 
} 

Sur ma classe Controller Je veux vérifier le numéro de section de chaque Item afin de l'affecter à la section appropriée:

func getNumOfItemsPerSection(section: Int) -> Int { 
    var num = 0 
    switch section { 
    case 0: num = self.items.filter { $0.sectionNumber == .Section1 }.count 
    case 1: num = self.items.filter { $0.sectionNumber == .Section2 }.count 
    case 2: num = self.items.filter { $0.sectionNumber == .Section3 }.count 
    case 3: num = self.items.filter { $0.sectionNumber == .Section4 }.count 
    default: break 
    } 
    return num 
    } 

Cette méthode ne compile pas: L'opérateur binaire '==' ne peut pas être appliqué à des opérandes de type 'sectionNumber?' et '_'

Quelle est la bonne façon de faire cela? Merci!

+7

S'il vous plaît, s'il vous plaît Déclarez vos énumérations avec une lettre majuscule départ ('ItemNumber',' SectionNumber ') et cas minuscules, sinon le code entier est très confus à lire. La raison de l'erreur est que les variables enum sont des options. Comme enum ont toujours un nombre fixe de cas, les variables contenant généralement des enum sont supposées être non-optionnelles – vadian

+0

Encore beaucoup à apprendre ... Je ne connaissais pas cette convention de nommage. Gloire! – gmoraleda

Répondre

1

Il y a plusieurs problèmes avec votre code:

  1. Il brise la convention de nommage de Swift. Les types, y compris les énumérations, doivent être nommés en majuscules (ItemNumber). Les propriétés, telles que les cas d'énumération, doivent être en minuscules (item1)
  2. Un cas enum peut représenter une valeur "brute", telle qu'un Int ou String. Vous codez beaucoup de switch instructions pour correspondre à une énumération avec un nombre entier - vous n'avez pas besoin de faire cela.

Voilà comment je réécrire votre code:

public enum ItemNumber: Int { 
    case item1 // item1 is implicitly 0 
    case item2 
    case item3 
    case item4 
    case item5 
    case item6 
} 

public enum SectionNumber: Int { 
    case section1 = 0 // section1 is explicitly 0. You can start at any value. 
    case section2 
    case section3 
    case section4 
} 

public struct Item { 
    var itemNumber: ItemNumber? 
    var sectionNumber: SectionNumber? 
    var checkmark: Bool 

    init(sectionNumber: Int, itemNumber: Int, checkmark: Bool) { 
     self.itemNumber = ItemNumber(rawValue: itemNumber) 
     self.sectionNumber = SectionNumber(rawValue: sectionNumber) 
     self.checkmark = checkmark 
    } 
} 

Et votre fonction de contrôleur:

func getNumOfItemsPerSection(section: Int) -> Int { 
    guard let sectionNumber = SectionNumber(rawValue: section) else { return 0 } 
    return self.items.filter({ $0.sectionNumber == sectionNumber }).count 
} 
+0

Plus simple, plus propre, plus agréable ... Merci beaucoup! – gmoraleda

+0

J'ai encore une question: comment voulez-vous configurer un cas par défaut/fallback pour 'ItemNumber' et' SectionNumber'? Avec un 'switch' déclaration est assez simple ->' default: ', mais maintenant je ne suis pas sûr ... Merci encore! – gmoraleda

+0

Voir l'instruction 'guard let'? C'est comme cela que vous le faites –