Swift枚举

枚举为一组相关值定义了一个通用类型,从而可以让你在代码中类型安全地操作这些值。

特性

  • Swift 中的枚举可以是字符串、字符、任意的整数值,或者是浮点类型。
  • Swift 中的枚举成员可以指定任意类型的值来与不同的成员值关联储存(合集)。
  • Swift 中的枚举是具有自己权限的一类类型(计算属性、实例方法、扩展等)。

枚举语法

/// 定义枚举 
enum Direction {
    case top
    case left
    case bottom
    case right
}

/// 使用 Switch 语句来匹配枚举值
let direction = Direction.top
switch direction {
case .top:
    // TODO
default:
    break
}

// 不能给未指定类型的枚举成员提供值(case top = "Top"❌)
error:  Enum case cannot have a raw value if the enum does not have a raw type
// 并且无法使用rawValue属性(direction.rawValue❌)
error: Value of type 'Direction' has no member 'rawValue'
  • Swift 中的枚举可以不指定类型,如果不指定类型则不能设置成员值、且不能使用rawValue属性

原始值

// MARK: -隐式原始值

/// 时分秒
enum Time: Float {
    case second
    case minute
    case hour
}

/// 年月日
enum DateTime: String {
    case day
    case month
    case year
}

// MARK: -显式原始值

/// 形状 (提供原始值) 
enum Shape: String {
    case circle = "Circle"
    case square = "Square"
    case prismatic = "Prismatic"
    case oval = "Oval"
 }

// MARK: -隐式+显式原始值

/// 行星 (只提供第一个成员的原始值)
enum Planet: Int {
    case mercury = 1
    case venus 
    case earth
}

// 当数值被用于作为原始值时,每个成员的隐式值都比前一个大一。如果第一个成员没有值,那么它的值是 0 。
let time = Time.second
print(time. rawValue)  // 0.0

// 当字符串被用于原始值,那么每一个成员的隐式原始值则是那个成员的名称。
let date = DateTime.year
print(date. rawValue)  // "year"

// 显示原始值
let shape = Shape.square
print(shape. rawValue)  // "Square"

// Planet.mercury有一个明确的原始值 1,后续的每成员的隐式值都比前一个大一
let planet = Planet. venus
print(planet. rawValue)  // 2

  • 枚举类型可以是字符串、字符、任意的整数值,或者是浮点类型。
  • 如果没有给指定类型的枚举成员提供原始值,那么Swift 将会自动为枚举成员分配值(即:隐式指定的原始值)。可以通过rawValue属性来访问一个枚举成员的原始值。

原始值初始化

let shape = Shape(rawValue: "ball")
print(type(of: shape))  // Optional<Shape>
  • 原始值的初始化器总是返回可选的枚举成员,不能直接使用 Switch 语句来匹配枚举值

计算属性、实例方法、Extension

extension Shape {
    /// 不能增加存储属性
    // var size: CGSize? ❌
    // error: Enums must not contain stored properties
    
    /// 可以添加计算属性
    var description: String {
        switch self {
        case .circle:
            return "圆"
        case .square:
            return "矩形"
        case .prismatic:
            return "棱形"
        case .oval:
            return "椭圆"
        }
    }
    
    /// 实例方法
    func currentShape() -> String {
        return self.rawValue
    }
    
    /// 静态方法
    static func objectShape() {
        
    }
}
  • swift枚举的计算属性用来提供关于枚举当前值的额外信息,并且实例方法用来提供与枚举表示的值相关的功能。

关联值

enum Shopping {
    case clothes(number: Int, discount: Float)
    case shoes(size: String, price: Float)
}

// 协议抽离计算属性
protocol DescriptionConvertible {
    var description: String { get }
}

extension Shopping: DescriptionConvertible {
    var description: String {
        switch self {
        case .clothes(let number, let price):
            return "衣服\(number)件,\(price)折"
        case .shoes(let size, let price):
            return "鞋子\(size)码,单价\(price)RMB"
        }
    }
}
let clothes = Shopping.clothes(number: 2, discount: 8)
print(clothes.description)    // 衣服2件,8折
  • Swift 枚举可以存储任意给定类型的关联值,将其它类型的关联值与这些成员值一起存储

number/discount/size/price是任意给定的类型,并且这些关联值会与clothes/shoes成员值一起存储。并且这些关联值可以在switch匹配中使用

合集

enum Apprearance {
    enum Sizes {
        static let gutter: CGFloat = 15
        static let cardGutter: CGFloat = 8
    }
    
    enum Color {
        static let primaryColor = UIColor(red: 0.22, green: 0.58, blue: 0.29, alpha: 1.0)
        static let secondaryColor = UIColor.lightGray
        static let background = UIColor.white
        enum Red {
            static let medium = UIColor(red: 0.22, green: 0.58, blue: 0.29, alpha: 1.0)
        }
    }
}

// 使用
self.view.backgroundColor = Apprearance.Color.Red.medium
  • swift枚举可以定义一组相关成员的合集作为枚举的一部分,每一个成员都可以有不同类型的值的合集与其关联。
  • 可以多级嵌套,使用于最小化常量作用域(Constants)

遍历枚举

enum Direction: CaseIterable {
    case top
    case left
    case right
    case bottom
}

for item in Direction.allCases {
   print(item)
}
  • swift枚举是可以遍历的,但前提是要求遵守CaseIterable协议,就可以通过allCases获取所有的枚举成员。

相关资料:
Swift编程语言-枚举
最小化常量作用域

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335