枚举的枚举,避免使用Any类型

时间:2019-05-13 19:43:19

标签: swift nested enumeration class-design

我正在为一个应用程序构建模型,该模型可跟踪与婚纱更改有关的数据。我们的模型图显示了相关的枚举,其中“ Section”是最外面的枚举,然后每种情况都连接到另一个更详细的枚举。

当变更专家进行装修时,他们将输入他们计划进行的变更。我需要一种有效的方法来跟踪这些数量之间的关系。

See object model image

我已经实现了一个基本示例,但是我无法存储这些“ Alteration”对象的数组并定义适当的类型。

这是我的游乐场代码:

struct Alteration {

    var detail: Any

    enum section {
        case bodice
        enum Bodice {
            case addBraCups
            case addOrRemoveBoning
        }
        case sides
        enum Sides {
            case bustTakeInOrOut
            case hipOrWaistTakeInOrOut
        }
    }
}

var alterationOne = Alteration(detail: Alteration.section.Bodice.addBraCups)
var alterationTwo = Alteration(detail: Alteration.section.Sides.bustTakeInOrOut)

var alterations = [Any]()
alterations.append(alterationOne)
alterations.append(alterationTwo)

此代码可以编译,但是我不希望使用Any。我还想知道以这种方式嵌套枚举是否有意义,以及这些嵌套枚举是否在结构或类内部有意义。

2 个答案:

答案 0 :(得分:1)

尝试使用具有关联值的枚举。您的结构可能如下所示:

throw new Error(`Validation failed with the following errors:\n  ${errorList}`);
          ^
Error: Validation failed with the following errors:
  [SummitCodePipelineDemoStack/Pipeline] Artifact 'compile-output' was used as input before being used as output
at Synthesizer.synthesize (/home/stefan/Private/programmieren/aws/cdk/SummitCodePipelineDemo/node_modules/@aws-cdk/cdk/lib/synthesis.ts:51:15)
at App.run (/home/stefan/Private/programmieren/aws/cdk/SummitCodePipelineDemo/node_modules/@aws-cdk/cdk/lib/app.ts:75:27)
at Object.<anonymous> (/home/stefan/Private/programmieren/aws/cdk/SummitCodePipelineDemo/bin/summit_code_pipeline_demo.ts:8:5)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at startup (internal/bootstrap/node.js:283:19)
Subprocess exited with error 1

(假设您列出的每个更改都是互斥的)

答案 1 :(得分:0)

枚举的一个问题是它们用于相互排斥的事物。但是你不是。

我想我会使用变更类型的数组,并使用类和子类来指定每个类型。例如:

struct Dress {
    var bodiceAlterations = [BodiceAlteration]()
    var sideAlterations = [SideAlteration]()
}

enum InOrOut {
    case `in`
    case out
}
enum AddOrRemove {
    case add
    case remove
}

class BodiceAlteration {}

class BraCupAlteration : BodiceAlteration {
}

class BoningAlteration : BodiceAlteration {
    var addOrRemove = AddOrRemove.add
}

class SideAlteration {}


class BustAlteration : SideAlteration {
    var inOrOut = InOrOut.out
}

class HipAlteration : SideAlteration {
    var inOrOut = InOrOut.out
}

一个数组可以列出其类型的多个更改,并且如果没有该类型的更改,则数组可以愉快地为空。然后,子类会告诉您更具体的类型。枚举仅用于相互排斥的选择:髋关节改变可以在里面或外面,但不能同时出现。

课程为您提供成长的空间,例如适当添加测量值和其他数据作为属性。如果您有很多具有英制尺寸,日期等的类,则可以根据需要使用协议将它们结合起来(尽管如果它们 all 都可以从超类继承)