Reputation: 1943
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
Reputation: 93141
There are several problems with your code:
ItemNumber
). Properties, such as enum cases, should be in lowercase (item1
)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