• swift枚举(一)


    OC中的枚举

       typedef NS_ENUM(NSUInteger, IFLEnum) {
           A, B, C
       }
    
    • 1
    • 2
    • 3

    A,B, C分别默认代表0, 1, 2

    关键字enum 声明枚举

    swift中的枚举则更加灵活,并且不需要给枚举中的每一个成员都提供值

       enum IFLEnum {
           case one
           case two
           case three
       }
       
       let mEnum: IFLEnum = .two
       print(MemoryLayout.size)
       print(mEnum)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    结果

    1 - IFLEnum 结构所占用的内存大小为1字节

    two - mEnum枚举变量的 打印结果

    枚举成员提供原始类型

       enum IFLEnum: String {
           case one
           case two
           case three
       }
       
       let mEnum: IFLEnum = .two
       print(MemoryLayout.size)
       print(mEnum)
       print(mEnum.rawValue)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    结果

    1 - IFLEnum结构占据内存大小依然为1字节, 与原始类型无关

    two

    two - mEnum.rawValue 即原始值

       enum IFLEnum: String {
           case one
           case two = "第2个"
           case three
       }
       
       let mEnum: IFLEnum = .two
       print(MemoryLayout.size)
       print(mEnum)
       print(mEnum.rawValue)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    结果

    1

    two

    第2个 - mEnum.rawValue 原始值变为 赋值的原始类型一个值 “第2个”

    并且 原始类型修饰的枚举类型 不需要给每一个枚举成员都赋值

    只有 原始类型修饰的枚举 才有 rawValue

    隐式rawValue分配, 建立在Swift类型推断机制上

       enum IFLEnum: Int {
           case one
           case two
           case three = 10
           case four
       }
    
       print(MemoryLayout.size)
       let mEnum: IFLEnum = .one
       let mEnum1: IFLEnum = .two
       let mEnum2: IFLEnum = .three
       let mEnum3: IFLEnum = .four
       print(mEnum.rawValue)
       print(mEnum1.rawValue)
       print(mEnum2.rawValue)
       print(mEnum3.rawValue)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    结果

    1

    0

    1

    10

    11

    成员three 赋值为10,后面的成员 推断为 11,12…, 但不影响前面的成员,依然从0,1…

    但需要注意的是 赋值成员的 值 不能与前面的成员相冲突,比如前面两个成员 原始值为 0,1,

    three就不能赋值为 0, 1(前面的成员没做赋值操作的前提下)

    关联值&模式匹配

       enum IFLEnum {
           case circle(Double)
           case 
           case three = 10
           case four
       }
    
       print(MemoryLayout.size)
       let mEnum: IFLEnum = .circle(3.0)
       print(mEnum)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    结果

    25 - IFLEnum 结构所占内存 变为了25字节,暂且不表,后面会解释

    circle(3.0)

       enum IFLEnum {
            case circle(Double)
    	    case rectangle(Int, Int)
    	    case triangle(Int, Int, Int)
    	    case none
       }
    
        print(MemoryLayout.size)
        let mEnum: IFLEnum = .circle(3.0)
        let mEnum1: IFLEnum = .triangle(3, 4, 5)
    	print(mEnum)
    	print(mEnum1)
    	switch mEnum {
    	case .circle(let radius):
    	    print("圆半径: \(radius)")
    	case .rectangle(let length, let width):
    	    print("长方形 长:\(length), 宽:\(width)")
    	case .triangle(let width1, let width2, let width3):
    	    print("三角形 第一条边: \(width1), 第二条边: \(width2), 
    	    第三条边: \(width3)")
    	default:
    	    print("nothing")
    	}
    	switch mEnum1 {
    	case .circle(let radius):
    	    print("圆半径: \(radius)")
    	case .rectangle(let length, let width):
    	    print("长方形 长:\(length), 宽:\(width)")
    	case .triangle(let width1, let width2, let width3):
    	    print("三角形 第一条边: \(width1), 第二条边: \(width2), 
    	    第三条边: \(width3)")
    	default:
    	    print("nothing")
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    结果

    25

    circle(3.0)

    triangle(3, 4, 5)

    圆半径: 3.0

    三角形 第一条边: 3, 第二条边: 4, 第三条边: 5

    模式匹配另一种写法

    	switch mEnum1 {
    	case let .circle(radius):
    	    print("圆半径: \(radius)")
    	case let .rectangle(length, width):
    	    print("长方形 长:\(length), 宽:\(width)")
    	case let .triangle(width1, width2, width3):
    	    print("三角形 第一条边: \(width1), 第二条边: \(width2), 
    	    第三条边: \(width3)")
    	default:
    	    print("nothing")
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    枚举结构的大小

    区分几种不同的情况

    No-payload enums

    	enum Week {
    	    case Monday
    	    case Tuesday
    	    case Wednesday
    	    case Thursday
    	    case Friday
    	    case Saturday
    	    case Sunday
    	}
    	
    	print(MemoryLayout.size)
    	print(MemoryLayout.stride)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    结果

    1

    1

    在swift中进行枚举内存布局的时候,一直都是尝试使用最少的空间来存储

    对于当前case的数量来说,UInt8能够标识256种case

    也就意味着如果一个默认枚举类型没有关联值的case 少于256,都是1字节大小

    在这里插入图片描述

    控制台打印可以看到

    3个枚举变量 mWeek1, mWeek2, mWeek3 存储的内容分别是 01 04 06, 与上所说布局一致

    swift枚举(二)

  • 相关阅读:
    清明作业 c++
    PostgreSQL的学习心得和知识总结(一百一十一)|内核级自上而下完美实现PostgreSQL数据库 日志格式tsvlog 的实现方案
    从零开始上手 MQTT over QUIC:快速体验下一代物联网标准协议
    vue2和vue3的区别
    投影仪假1080P和真1080P的差别,4000元价位真1080P投影仪推荐
    决策树(Decision tree)基本原理与基于scikit-learn的实现
    千万别再学python编程了?编程没用了?马上就要被淘汰啦?
    CTF 全讲解:[SWPUCTF 2021 新生赛]Do_you_know_http
    linux下日志查看命令
    vue模板语法上集
  • 原文地址:https://blog.csdn.net/qq_42431419/article/details/127970231