Перечисление перечислений и избегание использования любого типа - PullRequest
1 голос
/ 13 мая 2019

Я создаю модель для приложения, которое отслеживает данные, связанные с изменениями свадебного платья. На нашей модельной диаграмме показаны связанные перечисления, причем «Раздел» является крайним перечислением, а затем каждый случай соединяется с дополнительным, более подробным перечислением.

Когда Специалист по изменениям будет делать примерку, он будет вводить, какие изменения он планирует сделать. Мне нужен эффективный способ отслеживать отношения между этими величинами.

См. Изображение модели объекта

Я реализовал базовый пример, но у меня возникли проблемы с сохранением массива этих объектов «Изменение» и определением соответствующего типа.

Вот мой код детской площадки:

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 ]

1 голос
/ 13 мая 2019

Попробуйте использовать перечисления со связанными значениями.Ваши структуры могут выглядеть так:

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)

(при условии, что каждое из перечисленных вами изменений взаимоисключающее)

0 голосов
/ 13 мая 2019

Одна проблема с перечислениями заключается в том, что они предназначены для взаимоисключающих вещей.Но у вас это не так.

Я думаю, я бы использовал массивы типов изменений и использовал бы классы и подклассы, чтобы указать, что это за каждый.Например:

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
}

Массив может перечислить несколько изменений своего типа, и массив может быть счастливо пустым, если нет изменений этого типа.Затем подкласс сообщает вам более конкретный тип.Перечисления только для взаимоисключающего выбора: изменение бедра может быть как входным, так и исходящим, но не обоим.

Классы дают вам возможность расти, например, добавлять измерения и другие данные в качестве свойств, в зависимости от ситуации.Если у вас есть много классов с измерениями в дюймах, датами и т. Д., Вы можете использовать протокол для их объединения (если вам нужно (хотя, если они все , то вы можете просто наследовать от суперкласса).

...