Шаблон привязки значений со структурами Swift

Самый простой способ - добавить ограничение на ваш общий интерфейс:

public interface IInjectator 
    where T : InjectableClass 
{ }

Таким образом .net не позволит вам получить недопустимый тип.

Если вы не можете этого сделать, нет простого способа изменить поведение RegisterGeneric, как я могу видеть, это подписаться на событие OnActivated и выбросить исключение:

builder.RegisterGeneric(typeof(Foo<>))
        .As(typeof(IFoo<>))
        .OnActivated(e =>
        {
            Boolean isValid = e.Component.Services
                .OfType()
                .Where(s => s.ServiceType.IsConstructedGenericType
                            && s.ServiceType.GetGenericTypeDefinition() == typeof(IFoo<>)
                            && s.ServiceType.GetGenericArguments()[0].IsAssignableTo())
                .Any();

            if (!isValid)
            {
                throw new Exception("boom");
            }
        });

Если вы не хотите генерировать исключение, вы можете реализовать свой собственный IRegistrationSource. Вы можете посмотреть исходный код нативного OpenGenericRegistrationSource , который разрешает открытые общие типы.

2
задан Davor Cubranic 20 January 2019 в 15:06
поделиться

2 ответа

Структуры не могут быть разрушены в Swift.

Ваш кортеж, point = (3, 2), относится к типу (Int, Int), что является частью того, почему вы можете его деструктурировать.

Тип вашей структуры, S, просто S. Его переменные, a и b, не включены в его тип так же буквально, как и для кортежа. Структура - это просто совершенно другой тип объекта, и такого поведения для него не существует.

0
ответ дан Daniel 20 January 2019 в 15:06
поделиться

Это не существует как таковое в языке.

Одним из вариантов является вычисляемое вспомогательное свойство:

struct S {
    let i: Int
    let b: Bool
}

extension S {
    var destructured: (Int, Bool) {
        return (self.i, self.b)
    }
}

let s = S(i: 10, b: false)
let (i, b) = s.destructured

Конечно, вы должны вручную синхронизировать его. Возможно, Sourcery мог бы помочь с этим.

0
ответ дан Josh Caswell 20 January 2019 в 15:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: