Swift枚举

作者: dongwenbo | 来源:发表于2017-01-07 20:40 被阅读73次

    枚举就是给一组值定义一种类型,作用是类型安全地使用这些值。C语言中的枚举,会默认分配从0增长。Swift中,可以有原始值,也可以没有。类型可以为字符串,字符,数值。除了原始值,还有关联值,关联值类型可以为任意类型。(需不需要类型统一)
    枚举还支持计算属性,实例方法,构造函数,协议
    语法:

    enum Type {
        case type1
        case type2
        case type3
    }
    

    type1type2type3不会被默认赋值0,1,2
    还可以写成

    enum Type {
        case type1,type2
        case type3
    }
    

    赋值

    enum Type {
        case type1,type2
        case type3
    }
    
    var type = Type.type1
    type = .type2
    
    print(type)
    

    typeType类型,值为type1。由于type类型已经确定,所以第二次赋值时,可以省略类型名

    使用 Switch 语句匹配枚举值

    switch type{
        case .type1:
        print(type)
        case .type2:
        print(type)
        case .type3:
        print(type)
    }
    

    default

    switch type{
    case .type1:
        print(type)
    default:
        print(type)
    }
    

    原始值

    原始值(默认值)类型必须统一,原始值必须是字面量,必须唯一

    enum Type:Int {
        case type1 = 1
        case type2
        case type3
    }
    
    print(Type.type1.rawValue)
    print(Type.type2.rawValue)
    print(Type.type3.rawValue)
    

    在类型名后指定原始值类型,在类型值后指定原始值,打印1,2,3,这说明,后面的两个值是自动累加。

    那试试字符串类型,赋值a,后面会不会自动赋值b,c

    enum Type:String {
        case type1 = "a"
        case type2
        case type3
    }
    
    print(Type.type1.rawValue)
    print(Type.type2.rawValue)
    print(Type.type3.rawValue)
    

    打印a type2 type3,默认把枚举名当作字符串作为原始值

    那再试试字符类型

    enum Type:Character {
        case type1 = "a"
        case type2 = "b"
        case type3
    }
    
    print(Type.type1.rawValue)
    print(Type.type2.rawValue)
    print(Type.type3.rawValue)
    

    报错为:当不是stringint类型时,枚举必须有确定的值。
    因为stringint可以推断后续的值?

    枚举的隐式赋值

    当类型为stringint,后续的值可以被隐式赋值
    int累加,string为string类型,值为枚举名

    关联值

    关联值类型可以不同

    enum Type{
        case type1(Int,Int)
        case type2(String)
    }
    
    var a = Type.type2("123")
    var b = Type.type1(1, 1)
    
    print(a,b)
    
    switch a{
    case .type1(let a,let b):
        print("\(a) \(b)")
    case .type2(let a):
        print(a)
    }
    

    有了关联值好像就不可以有原始值?
    当绑定类型相同时,可以把let写前面

    switch a{
    case let .type1(a,b):
        print("\(a) \(b)")
    case .type2(let a):
        print(a)
    }
    

    关联值和原始值是不同的,原始值是枚举定义时预填充的值,对于特定的枚举类型,原始值是不变的。关联值是创建一个基于枚举成员的常量或变量时才设置的值,枚举成员的关联值可以变化。

    使用原始值初始化枚举

    enum Type:Int{
        case type1 = 1
        case type2 = 2
    }
    
    var type = Type(rawValue: 1)
    print((type?.rawValue)!)
    

    在定义了原始值后,将自动获得Type(rawValue:1)构造方法,这是一个可失败构造器,返回可选类型。

    递归枚举

    暂时不做讲解

    相关文章

      网友评论

        本文标题:Swift枚举

        本文链接:https://www.haomeiwen.com/subject/rxmfbttx.html