Удалить перечисление из массива перечислений независимо от его аргумента - PullRequest
1 голос
/ 06 июня 2019

У меня есть перечисление BulletinOptions:

enum BulletinOption {
    case notificationPermissions
    case enableNotifications(eventId: String)
    case join(hostName: String, eventId: String)
    case share(type: SocialBulletinItem.BulletinType.Social, event: EventJSONModel, view: UIView)
    case completedShare(type: SocialBulletinPageItem.SocialButtonType)
}

У меня есть массив таких перечислений:

let array = [
    .join(hostName: hostName, eventId: event.id),
    .notificationPermissions,
    .enableNotifications(eventId: event.id),
    .share(type: .queue(position: 0, hostName: ""), event: event, view: view)
]

Я хочу создать функцию, которая может удалить конкретное перечисление из этого массива. У меня есть этот код:

func remove(
    item: BulletinOption,
    from options: [BulletinOption]) -> [BulletinOption] {
    var options = options

    if let index = options.firstIndex(where: {
        if case item = $0 {
            return true
        }
        return false
    }) {
        options.remove(at: index)
    }

    return options
}

Что я хочу сделать, это:

let options = remove(item: .enableNotifications, from: options)

Однако это дает мне две ошибки. Функция remove сообщает:

Шаблон выражения типа «BulletinOption» не может соответствовать значениям типа «BulletinOption»

для линии:

if case item = $0

Вторая ошибка при вызове этой функции:

Элемент 'enableNotifications' ожидает аргумент типа '(eventId: String)'

Я просто хочу удалить это перечисление независимо от его аргумента. Как я могу это сделать?

1 Ответ

0 голосов
/ 06 июня 2019

В настоящее время это невозможно.

То, что вы пытаетесь сделать, - это, по сути, передача шаблона регистрационного случая в качестве аргумента методу, чтобы этот метод мог сопоставить каждое значение в массиве с этим шаблоном. Тем не менее, swift guide гласит:

Шаблон регистра перечисления соответствует регистру существующего типа регистра. Шаблоны регистров перечисления появляются в метках switch операторов регистра и в условиях case операторов if, while, guard и for-in.

Это означает, что шаблоны регистрационных перечислений не допускаются в качестве аргументов функций. (

Итак, лучшее, что вы можете сделать, это:

array.filter {
    if case .enableNotifications = $0 { return false } else { return true }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...