Swift 系统学习 15 枚举

//: Playground - noun: a place where people can play

import UIKit

/*
 * 本节主要内容:
 * 1.枚举类型声明和初始化(**)
 * 2.rawValue: 源值
 * 3.associated value关联值(****)
 */


// 枚举类型特点: 有限个可能性 + 初始化只能有一种可能性
// 结构体特点: 多个属性一起描述对象; CLLocation: 纬度 + 经度
// 声明描述一周七天的枚举类型
/*
 * 1.枚举类型首字母必须大写
 * 2.多个case关键词
 * 3.没有逗号
 * 4.可能性中的单词没有特定要求
 */
enum Week {
    // 可能性
    case Monday // 没有关联任意类型的值
    case Tuesday
    case Wednesday
    case Thursday
    case Friday
    case Saturday
    case Sunday
}
// 声明方式二:
enum WeekNew {
    case Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
}

// 实例化
// 隐式
let currentDay = Week.Wednesday
// 显式
let tomorrowDay: Week = Week.Thursday

// 声明函数: 参数是Week枚举类型, 返回String
// 枚举类型名字可以省略(推荐)
func workDay(week: Week) -> String {
    switch week {
    case .Monday, .Tuesday, .Wednesday, .Thursday, .Friday:
        return "This is the working day!"
    case .Saturday, .Sunday:
        return "This is the weekend!"
    }
}
// 调用
let resultStr = workDay(week: currentDay)


// 声明Week枚举类型关联整型
/*
 * 1.枚举类型如何和某个类型进行关联, 每个case都会和该类型的默认值进行绑定
 * 2.rawValue(源值):查看绑定值
 * 3.除了默认的值, 可以绑定任意不连续的值(类型一致), 但是必须唯一(**)
 * 4.两种方式构造枚举对象: init构造方法; 点语法(推荐)
 * 5.枚举类型只能关联Int/Float/Double/String/Character数据类型
 */
enum WeekWithInt: Int {
    case Monday = 1 // 默认值0
    case Tuesday = 3 // 默认值1
    case Wednesday = 5
    case Thursday = 7
    case Friday = 9
    case Saturday
    case Sunday
}
// 实例化: 构造+解包
if let newDay = WeekWithInt.init(rawValue: 10) {
    print("newDay's rawValue is \(newDay.rawValue)")
}
var anotherDay = WeekWithInt.Friday
anotherDay.rawValue

// 声明描述苹果公司产品的枚举类型
/*
 * 1.关联String, 每个case绑定的默认值为case的名字
 * 2.也可以任何绑定String类型值
 */
enum Devices: String {
    case iPodTouch = "iPod"
    case iPhone
    case iPad
    case MacBookPro = "MacBook Pro"
    case iWatch
    case AppleTV
    case Nano
}
// 实例化
var currentDevice = Devices.MacBookPro
currentDevice.rawValue

// 声明描述HTTP协议错误码的枚举类型
enum HttpErrorCode: String {
    case code400 = "Bad Request"
    case code401 = "Unauthorized"
    case code402 = "Payment Required"
    case code403 = "Forbidden"
    case code404 = "Not Found"
}

/* associated value(关联值): 重点+难点
 * 引言: 声明阶段枚举关联某个类型, case的rawValue确定了, case的绑定值是一个常量, 不可以改变; 无法满足下面的需求: 声明阶段关联变量, 实例化阶段再关联值
 * 第一阶段: 声明枚举类型
 * 第二阶段: 实例化
 */

// 声明描述ATM状态的枚举类型
enum ATMStatus {
    case Success(Int)
    case Error(String)
    case Waiting // (String)
    
    // 添加方法(语法和声明函数一样)
    // 使用频率较低
    func getString() -> String {
        return "hello"
    }
}
// 实例化
let atmStatus = ATMStatus.Success(20)
atmStatus.getString()

// 实例化阶段对case关联特定类型的值
// 声明函数, 参数是取的钱数, 返回ATMStatus枚举类型
// 卡里的钱数
var balance = 1000
func withDraw(amount: Int) -> ATMStatus {
    // 成功, 返回剩余的钱数
    if balance >= amount {
        balance -= amount
        return ATMStatus.Success(balance)
    } else {
        // 失败, 返回错误原因
        return ATMStatus.Error("Not enough money!")
    }
}
let status = withDraw(amount: 600)
// 如何获取剩余的钱数, 或者获取错误原因
switch status {
case let .Success(leftMoney):
    print("Left money is \(leftMoney)")
case let .Error(errorMsg):
    print("Error message is \(errorMsg)")
case .Waiting:
    print("Waiting for processing!")
}

// 验证枚举类型是值类型
enum Direction {
    case North
    case South
    case West
    case East
}
var oneDirection = Direction.East
var twoDirection = oneDirection
// 修改
oneDirection = .North

/*
 * 课堂练习一:
 * 1.声明一个枚举类型Month, 描述一年12个月
 * 2.声明函数, 参数Month, 返回字符串, 描述"春/夏/秋/冬"
 * 3.调用/验证函数
 */

/*
 * 课堂练习二: 
 * 1.声明一个描述形状的枚举类型Shape, 正方形/矩形/圆/二维点
 * 2.声明函数, 参数Shape, 返回该形状的面积Double
 * 3.调用/验证函数
 * 4.提示: 每个形状关联类型(associate value)
 */





你可能感兴趣的:(Swift,系统学习系列)