从枚举数组中删除枚举,无论其参数如何

时间:2019-06-06 16:26:20

标签: swift enums

我有一个枚举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 :(得分:0)

目前这是不可能的。

您实际上想做的是将枚举用例模式作为方法的参数传递,以便该方法可以将数组中的每个值与该模式进行匹配。但是,swift guide说:

  

枚举案例模式与现有枚举类型的案例匹配。枚举用例模式出现在switch语句用例标签和caseifwhileguard语句的for-in条件中。 / p>

这意味着不允许将枚举大小写模式用作函数的参数。 :(

所以您能做的就是:

array.filter {
    if case .enableNotifications = $0 { return false } else { return true }
}