от
Есть ли способ, чтобы достичь заказал условную безопасность типов в массивах? Например, если я хочу ДСЛ, как способ создать бургер, я хочу сказать что-то вроде:
let burgerComponents = .burger(
    .buns(2),
    .beefPatty(1),
    .lettuce(),
    .mustard(),
    .mushrooms()
)
Если вы добавляете типа Колобка нельзя снова добавить его в этот массив. Если добавить beefPatty вы не можете добавить его снова и так далее. Наивный подход мог бы заключаться в создании
Struct
:
struct Burger {

    let buns: Int
    let patties: Int
    let lettuce: Bool
    let mustard: Bool
    let mushrooms: Bool

    init(
        buns: Int = 2,
        patties: Int = 1,
        lettuce: Bool = false,
        mustard: Bool = false,
        mushrooms: Bool = false) {
        self.buns = buns
        self.patties = patties
        self.lettuce = lettuce
        self.mustard = mustard
        self.mushrooms = mushrooms
    }
}

extension Burger {
     static func burger(
        buns: Int = 2,
        patties: Int = 1,
        lettuce: Bool = false,
        mustard: Bool = false,
        mushrooms: Bool = false) 

Однако нельзя расширить и добавить дополнительные свойства, чтобы бургер структуры (майонез, острая горчица и т. д.). Типизированное решение без тегов решает, что, однако, к сожалению, не дает заказать соответствие. 

Решение Struct
работает, если вам нужно не расширяемое решение, однако, так как я создаю расширяемый API, что другие авторы могли бы добавить дополнительные функциональные возможности, решение структуры, к сожалению, не решит эти требования! Пути я исследовал это типа Фантома и набирается без тегов решений. Набирается Без Тегов
struct Burger {
   let buns: Int 
   let beefPatty: Int 
   let lettuce: Bool 
   let mustard: Bool 
   let mushrooms: Bool 
}

enum BurgerAttributes {
    case buns(Int)
    case beefPatty(Int) 
    case lettuce
    case mustard
    case mushrooms
}

protocol BurgerComponents {
    static func buns(_ numberOfBuns: Int) 

Теперь вы должны быть в состоянии создать бургер в DSL, как мода:

let builder: BurgerBuilder = .burger(   
    .buns(2),
    .beefPatty(1),
    .lettuce(),
    .mustard(),
    .mushrooms()
)

let burger: Burger = builder.compose()
// Output: Burger(buns: 2, beefPatty: 1, lettuce: true, mustard: true, mushrooms: true)
Так набирается без тегов решение удовлетворяет некоторым требованиям, однако если вы хотели бы получить условный заказ невозможно с типизированное решение без тегов. С типизированными без тегов вы можете определить неограниченное количество атрибутов:
let builder = BurgerBuilder = .burger(
    .buns(2),
    .buns(0),
    .buns(10),
    .mustard()
)
Там нет безопасности для внешнего пользователя API. Есть ли способ, чтобы достичь соответствия заказанного типа в следующем формате?
let burgerComponents = .burger(
    .buns(2),
    .beefPatty(1),
    .lettuce(),
    .mustard(),
    .mushrooms()
)

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
...