Enumerations 的枚举和避免使用 Any 类型

Enumeration of Enumerations and avoiding the use of Any type

我正在为跟踪与婚纱修改相关的数据的应用构建模型。我们的模型图显示了相关的枚举,"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。我还想知道以这种方式嵌套枚举是否有意义,以及这些嵌套枚举在结构或 class.

内部是否有意义

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

enum BodiceVariation {
    case addBraCups
    case addOrRemoveBoning
}

enum SidesVariation {
    case bustTakeInOrOut
    case hipOrWaistTakeInOrOut
}

enum Alteration {
    case bodice(BodiceVariation)
    case sides(SidesVariation)
}

let alterationOne = Alteration.bodice(.addBraCups)
let alterationTwo = Alteration.sides(.bustTakeInOrOut)

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

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

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

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

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
}

一个数组可以列出其类型的多个变化,如果没有该类型的变化,数组可以很高兴地为空。然后子类告诉你更具体的类型。枚举只是为了相互排斥的选择:髋关节改变可以是 in 或 out,但不能两者兼而有之。

类 给你成长的空间,例如酌情添加测量值和其他数据作为属性。如果你有很多 类 有英寸测量值、日期等,你可以在需要时使用协议将它们联合起来(尽管如果它们 all 有你只能从超类继承)。