嵌套和关联的枚举值Swift

时间:2015-09-22 03:58:12

标签: swift enums

NSHipster在处理表或集合视图时认可的最佳实践之一是使用枚举来表示每个部分,如下所示:

typedef NS_ENUM(NSInteger, SomeSectionType) {
    SomeSectionTypeOne = 0,
    SomeSectionTypeTwo = 1,
    SomeSectionTypeThree = 2
}

这使得切换语句非常容易,或者如果:

if(indexPath.section == SomeSectionTypeOne) {
    //do something cool
}

对于包含静态内容的部分,我将概念扩展为包含每个项目的枚举:

typedef NS_ENUM(NSInteger, SectionOneItemType) {
    ItemTypeOne = 0,
    ItemTypeTwo = 1
}

if(indexPath.section == SomeSectionTypeOne) {
     switch(indexPath.item) {
     case SectionOneItemType:
         //do something equally cool
     default:
     }
}

在Swift中,除了这次利用嵌套枚举之外,我还想复制相同的行为。到目前为止,我已经能够做到这一点:

enum PageNumber {
    enum PageOne: Int {
        case Help, About, Payment
    }
    enum PageTwo: Int {
        case Age, Status, Job
    }
    enum PageThree: Int {
        case Information
    }
    case One(PageOne)
    case Two(PageTwo)
    case Three(PageThree)
}

但是我无法看到如何从NSIndexPath开始并初始化正确的大小写,然后使用switch语句来提取值。

1 个答案:

答案 0 :(得分:0)

不要认为你可以使用嵌套枚举来决定节和行单元格来自哪个。因为关联值和原始值不能在Swift枚举中共存。需要多个枚举

enum sectionType: Int {
    case sectionTypeOne = 0, sectionTypeTwo, sectionTypeThree
}

enum rowTypeInSectionOne: Int {
    case rowTypeOne = 0, rowTypeTwo, rowTypeThree
}

//enum rowTypeInSectionTwo and so on

let indexPath = NSIndexPath(forRow: 0, inSection: 0)

switch (indexPath.section, indexPath.row) {
case (sectionType.sectionTypeOne.rawValue, rowTypeInSectionOne.rowTypeOne.rawValue):
    print("good")
default:
    print("default")
}