Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 枚举并避免使用任何类型_Swift_Nested_Enumeration_Class Design - Fatal编程技术网

Swift 枚举并避免使用任何类型

Swift 枚举并避免使用任何类型,swift,nested,enumeration,class-design,Swift,Nested,Enumeration,Class Design,我正在为一个应用程序建立一个模型,该应用程序跟踪与婚纱改动相关的数据。我们的模型图显示了相关的枚举,其中“Section”是最外层的枚举,然后每个案例都连接到一个额外的、更详细的枚举 当改装专家进行装配时,他们将输入计划进行的改装。我需要一种有效的方法来跟踪这些量之间的关系 我已经实现了一个基本示例,但是在存储这些“变更”对象的数组和定义适当的类型时遇到了问题 这是我的游乐场代码: struct Alteration { var detail: Any enum secti

我正在为一个应用程序建立一个模型,该应用程序跟踪与婚纱改动相关的数据。我们的模型图显示了相关的枚举,其中“Section”是最外层的枚举,然后每个案例都连接到一个额外的、更详细的枚举

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

我已经实现了一个基本示例,但是在存储这些“变更”对象的数组和定义适当的类型时遇到了问题

这是我的游乐场代码:

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
。我还想知道以这种方式嵌套枚举是否有意义,以及这些嵌套枚举在结构或类内部是否有意义。

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

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,但不能两者兼而有之


这些类为您提供了增长空间,例如,根据需要添加测量值和其他数据作为属性。如果您有很多类都有英寸测量值、日期等,如果需要,您可以使用协议将它们联合起来(尽管如果它们都有,您可以从超类继承)。

这很好,谢谢@Gereon。我的下一步是现在为每个xVariation枚举附加三个价格。我需要一种方法来获取/设置每次更改的minPrice、maxPrice和actualPrice值。我是在变更枚举内声明计算属性,还是在xVariation枚举内声明计算属性?类似于此处显示的“值”的计算属性:这在很大程度上取决于您计划如何获取和/或计算价格值。如果你把它放在一个单独的问题中,再加上更多你想要实现的示例代码,可能是最好的。谢谢你,马特。这使工作效率大大提高。