Одна проблема с перечислениями заключается в том, что они предназначены для взаимоисключающих вещей.Но у вас это не так.
Я думаю, я бы использовал массивы типов изменений и использовал бы классы и подклассы, чтобы указать, что это за каждый.Например:
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
}
Массив может перечислить несколько изменений своего типа, и массив может быть счастливо пустым, если нет изменений этого типа.Затем подкласс сообщает вам более конкретный тип.Перечисления только для взаимоисключающего выбора: изменение бедра может быть как входным, так и исходящим, но не обоим.
Классы дают вам возможность расти, например, добавлять измерения и другие данные в качестве свойств, в зависимости от ситуации.Если у вас есть много классов с измерениями в дюймах, датами и т. Д., Вы можете использовать протокол для их объединения (если вам нужно (хотя, если они все , то вы можете просто наследовать от суперкласса).