2017-10-19 96 views
0

我想用元素数组填充UITableView。这些元素是结构:访问结构内的枚举

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

在我的控制器类我要检查每个Item的部分号,以便将其分配给适当的部分:

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 
    } 

此方法不编译: 二元运算符'=='不能应用于类型'sectionNumber?'的操作数和'_'

这样做的正确方法是什么? 谢谢!

+7

请,请与起始大写字母('ItemNumber','SectionNumber宣布你的枚举')和小写的情况,否则整个代码读起来非常混乱。错误的原因是枚举变量是可选项。由于枚举总是有固定数量的情况,通常包含枚举的变量应该是非可选的 – vadian

+0

还有很多东西需要学习...不知道这个命名约定。奖励! – gmoraleda

回答

1

有几个问题与您的代码:

  1. 它打破了斯威夫特的命名约定。类型(包括枚举)应以大写字母(ItemNumber)命名。属性(例如枚举个案)应为小写(item1
  2. 枚举个案可以表示“原始”值,例如IntString。你的代码有很多switch语句将一个枚举与一个整数相匹配 - 你不需要这样做。

这是我会怎么重写代码:

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

而且你的控制器的功能:

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

更简单,更清洁,更好... 非常感谢! – gmoraleda

+0

我还有一个问题:如何为'ItemNumber'和'SectionNumber'设置默认/回退情况?使用'switch'语句非常简单 - >'default:',但现在我不确定... 再次感谢! – gmoraleda

+0

看到'guard let'声明?你就是这么做的 –