Swift替换旧式枚举

时间:2015-07-22 08:31:10

标签: ios macos swift enums

回到旧的Objective-C时代,我会经常使用枚举来处理具有常量内容,分段控件等的表格 - 在强制增量的整数列表从零开始的情况下。我还经常在末尾添加一个... count成员来计算这些条目,对表格部分有用。行。尝试使用快速枚举实现这一点很麻烦 - 很多转换为&从原始值和开关中的额外默认子句允许'count'条目。任何人都可以建议一种处理这种情况的优雅方法吗?

2 个答案:

答案 0 :(得分:2)

Swift中仍然可以使用自动增量。

enum Section: Int {
   case A = 0
   case B
   case C
}

Section.C.rawValue // -> 2

至于count,您应该手动实施(How do I get the count of a Swift enum?):

enum Section: Int {
   case A = 0
   case B
   case C

   static let count = C.rawValue + 1
}

至于“与原始值和额外默认条款的转换”问题,请与enum而不是rawValue进行比较。

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return Section.count
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch Section(rawValue: section)! {
    case .A: return 1
    case .B: return 2
    case .C: return 5
    }
}

如果你想做array[Section.A]之类的事情,你可以轻松实现它。

extension Array {
    subscript(section: Section) -> T {
        return self[section.rawValue]
    }
}

extension NSIndexPath {
    convenience init(forRow row: Int, inSection section: Section) {
        self.init(forRow: row, inSection: section.rawValue)
    }
}

let array = ["foo", "bar", "baz"]
array[.B] // -> "bar"


let indexPath = NSIndexPath(forRow: 20, inSection: .C)
indexPath.section // -> 2
indexPath.row // -> 20

等等...... :)

答案 1 :(得分:0)

为每个枚举添加一个“count”函数。例如

static func count() -> Int { return 3 }

整数 - >枚举转换由init方法完成。