Используйте вложенные перечислимые падежи в качестве родительских перечислений - PullRequest
0 голосов
/ 05 июля 2018

В популярной настольной игре Монополия игроки имеют возможность покупать / обменивать различные объекты недвижимости, а когда они монополизируют определенный район, они могут строить дома. Я пытаюсь выразить все эти свойства как вложенное перечисление в Swift, но когда дело доходит до выражения свойств игрока в массиве, я в тупике.

Вот то, что я пробовал до сих пор.

enum Property {
    enum Brown {
        case mediterranean, baltic
    }

    enum LightBlue {
        case oriental, vermont, connecticuit
    }

    enum pink {
        case stCharles, states, virginia
    }
    ...
}

var properties: [Property] = [
    Property.Brown.baltic, // ERROR: Cannot convert value of type 'Property.Brown' to expected element type 'Property'
    Property.Brown.mediterranean
]

Как видите, я не могу сохранить эти свойства в массиве [Property], потому что Property.Brown не является свойством (понятно). Что мне нужно изменить, чтобы иметь возможность хранить Property.<Insert Neighborhood Here> s в массиве? Я понимаю, что [Любой] будет работать, но меня беспокоит безопасность типов, поэтому это не сработает.

Редактировать 05 июля 2018 года, 13:18 PDT Я пишу программу, которая будет выступать в роли банка для игры в монополию, и мне нужен способ определить, каким игрокам (или банку) принадлежат свойства. В настоящее время я занимаюсь игровыми площадками и прототипами, чтобы выяснить, что мне подходит.

1 Ответ

0 голосов
/ 05 июля 2018

Как известно,

потому что Property.Brown не является собственностью (понятно).

Вам может понадобиться тип, общий для вашего Property.Brown, Property. LightBlue, ...

Может быть, вы можете использовать протокол только для хранения их в массиве:

protocol PropertyEnums {}

enum Property {
    enum Brown: PropertyEnums {
        case mediterranean, baltic
    }

    enum LightBlue: PropertyEnums {
        case oriental, vermont, connecticuit
    }

    //...
}

var properties: [PropertyEnums] = [
    Property.Brown.baltic,
    Property.Brown.mediterranean,
    //...
]

Но я не могу быть уверен, что это может быть лучшим решением для вас, поскольку вы не показываете случаи использования properties.


Что-то подобное может быть лучше для некоторых случаев использования:

enum Property {
    enum Brown {
        case mediterranean, baltic
    }

    enum LightBlue {
        case oriental, vermont, connecticuit
    }

    //...

    case brown(Brown)
    case lightBlue(LightBlue)
    //...
}

var properties: [Property] = [
    .brown(.baltic),
    .brown(.mediterranean),
    //...
]

Пожалуйста, покажите нам, как вы хотите использовать properties.

...