写了一个枚举实例,包括了嵌套枚举和枚举的属性和方法,枚举的属性决定了枚举值不能有存储属性,只能有计算属性。但是枚举可以通过关联值来间接使用类似于存储属性的功能。
嵌套枚举中,内层枚举和外层枚举的方法是同属一个等级的。
一个枚举的实例方法可以配合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)")
}