iOS DeveloperIOS

Swift枚举

2017-01-07  本文已影响73人  dongwenbo

枚举就是给一组值定义一种类型,作用是类型安全地使用这些值。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)构造方法,这是一个可失败构造器,返回可选类型。

递归枚举

暂时不做讲解

上一篇下一篇

猜你喜欢

热点阅读