swift学习记录(枚举)

枚举定义了一个通用类型的一组相关值,使我们可以在代码中以一种安全的方式来使用这些值。

基本语法:

使用 enum 关键字定义枚举

enum 枚举名{

case 成员值

}

enum CompassPoint {
    case North
    case South
    case East
    case West
}


成员值

一个枚举中定义的值,是枚举的成员值(成员),case 关键字表示一个新的成员值将被定义。

枚举的成员值不会被默认赋予一个整型值。

多个成员值可以出现在同一行上,用逗号隔开:

<span style="font-size:14px;">enum Planet {
    case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}</span>

使用枚举成员值赋值时,可以采用 “枚举名.成员值“的形式

var value = CompassPoint.North

当swift编译器能够根据上下文推断出类型时,也可以使用“ . 成员值”的形式来赋值

var directionToHead= CompassPoint.North
   directionToHead = .West
如上,value 第一次 被赋值,第二次给value赋值时,编译器就能推断出是CompassPoint 类型,所以可以直接用 .West 给value赋值,增强代码的可读性。

原始值

枚举成员可以被默认值(原始值)赋值,其中这些原始值具有相同的数据类型。

基本语法:

enum  枚举名:数据类型{

case 成员值 = 默认值

}

enum WeekDays:Int{
    case Monday         = 0
    case Tuesday         = 1
    case Wednesday      = 2
    case Thursday        = 3
    case Friday          = 4
}

访问 枚举成员原始值

可以使用 枚举成员值的 rawValue 属性来访问 成员的原始值

<span style="font-size:14px;">var day = WeekDays.Friday.rawValue
print(day)
//4</span>

隐式赋值

在使用原始值为整数或者字符串类型的枚举时,不需要显式的为每一个成员赋值,这时,Swift将会自动赋值。

例如,当使用整数作为原始值时,隐式赋值的值依次递增1。如果第一个值没有被赋初值,将会被自动置为0。

enum WeekDays:Int{
    case Monday
    case Tuesday
    case Wednesday
    case Thursday
    case Friday
}


var day = WeekDays.Friday.rawValue
print(day)
//4  </span>

使用原始值初始化枚举变量

如果在定义枚举类型的时候使用了原始值,那么将会自动获得一个初始化方法,这个方法将原始值类型作为参

数,返回枚举成员或者nil 。你可以使用这种初始化方法来创建一个新的枚举变量。

enum WeekDays:String{
    case Monday = "Monday"
    case Tuesday
    case Wednesday
    case Thursday
    case Friday
}


var day = WeekDays(rawValue: "Friday")  //通过原始值 Friday  创建一个枚举变量
print(day)
//Optional(WeekDays.Friday) 
因为 不是所有的传入值都能匹配到一个原始值,所以返回值为 可选类型。

相关值

每个成员的数据类型可以不同。类似C中的联合类型

enum Figure {
    case type (String)
    case area (Int,Int)
}


var type = Figure.type("长方形")
var area = Figure.area(100, 200)
print("type is \(type)  and  area  is \(area)")
//type is type("长方形")  and  area  is area(100, 200)

递归枚举

递归枚举是一种枚举类型,表示它的枚举中,有一个或多个枚举成员拥有该枚举的,其他成员作为相关值。

基本语法:

enum 枚举名{

indirect  case  成员值

}

或者

indirect enum 枚举名{

case 成员值 

}

在成员值 前加 indirect 关键字,表示该成员值,可以递归,在 枚举类型前加indirect 关键字,表示所有成员都可以递归。

enum ArithmeticExpression {
    case Number(Int)
    indirect case Addition(ArithmeticExpression, ArithmeticExpression)
    indirect case Multiplication(ArithmeticExpression, ArithmeticExpression)
}


func evaluate(expression: ArithmeticExpression) -> Int {
    switch expression {
    case .Number(let value):
        return value
    case .Addition(let left, let right):
        return evaluate(left) + evaluate(right)
    case .Multiplication(let left, let right):
        return evaluate(left) * evaluate(right)
    }
}
// 计算 (5 + 4) * 2
let five = ArithmeticExpression.Number(5)
let four = ArithmeticExpression.Number(4)
let sum = ArithmeticExpression.Addition(five, four)

let product = ArithmeticExpression.Multiplication(sum, ArithmeticExpression.Number(2))
print(evaluate(product))
// 输出 "18"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值