枚举练习,包括了嵌套枚举和枚举的属性和方法

49 阅读2分钟

写了一个枚举实例,包括了嵌套枚举和枚举的属性和方法,枚举的属性决定了枚举值不能有存储属性,只能有计算属性。但是枚举可以通过关联值来间接使用类似于存储属性的功能。

嵌套枚举中,内层枚举和外层枚举的方法是同属一个等级的。

一个枚举的实例方法可以配合switch语句进行双向匹配。比如这个例子中,会员等级是switch的预设值,会员的权限是switch需要匹配的值。两个值都是枚举值,都不是固定值。

检查权限的方法,将会员权限代入到函数中进行switch匹配,因为switch中已经有预设值,这个预设值是程序员设定好的,匹配的结果返回布林值。

在使用的时候,使用forEach进行逐个比对,进而输入对应的权限。

enum 会员等级: String, CaseIterable {
    case 免费会员, 银卡会员, 金卡会员
    var 费用:Int {
        switch self {
        case .免费会员:
            return 0
        case .银卡会员:
            return 250
        case .金卡会员:
            return 400
        }
    }
    enum 权限: String, CaseIterable {
        case 观看旧片 = "观看旧片"
        case 跳过广告 = "跳过广告"
        case 下载影片 = "下载影片"
        case 观看新片 = "观看新片"
    }
    func 检查权限(_ 权限: 会员等级.权限) -> Bool {
        switch self {
        case .免费会员:
           return 权限 == .观看旧片
        case .银卡会员:
           return 权限 != .观看新片
        case .金卡会员:
            return true
        }
    }
    static let 所有会员类型 = 会员等级.allCases.map{$0.rawValue}.joined(separator: "、")
}
print("您好,请你选择要加入的会员类型: \(会员等级.所有会员类型)")
print("我们为会员提供的服务包括但不限于: \(会员等级.权限.allCases.map{ $0.rawValue})")
let 你的会员等级 = 会员等级.allCases.randomElement()!
print("您加入的是: \(你的会员等级), 您需要支付\(你的会员等级.费用)元/月")

会员等级.权限.allCases.forEach {
    let isAllowed = 你的会员等级.检查权限($0)
    print(isAllowed ? "✅您可以 \($0.rawValue)" : "❌您无法 \($0.rawValue)")
}