gmoraleda
gmoraleda

Reputation: 1943

Access enum inside struct

I'm trying to populate a UITableView with an array of elements. Those elements are structs:

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

On my Controller class I want to check the section number of each Item in order to assign it to the proper section:

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
  }

This method doesn't compile: Binary operator '==' cannot be applied to operands of type 'sectionNumber?' and '_'

What's the proper way of doing that? Thanks!

Upvotes: 1

Views: 6985

Answers (1)

Code Different
Code Different

Reputation: 93141

There are several problems with your code:

  1. It breaks Swift's naming convention. Types, including enums, should be named in uppercase (ItemNumber). Properties, such as enum cases, should be in lowercase (item1)
  2. An enum case can represent a "raw" value, such as an Int or String. You code has a lot of switch statements to match an enum with an integer - you don't need to do that.

Here's how I would rewrite your 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
    }
}

And your controller's function:

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

Upvotes: 3

Related Questions