首页 > 其他分享 >Swift开篇006->枚举

Swift开篇006->枚举

时间:2023-02-01 12:34:50浏览次数:49  
标签:case enum ArithmeticExpression 枚举 let 006 print Swift


PART_A 枚举简介

  1. 定义:一组相关的值定义了一个共同的枚举类型
  2. 语法格式
enum Direction {
case East
case South
case West
case North
case NorthWest, EastSouth // 多个成员值在一行时,可用逗号分开
}
  1. 类型推断
var currentDirection = Direction.East 

// 当类型已被推断出,可用简短语句(省略枚举类型名)来设置值:._
currentDirection =.South
  1. 使用Switch匹配枚举值
  • switch需要穷举枚举成员,可以使用default分支来涵盖所有未明确处理的枚举成员
var currentDirection = Direction.East           
switch currentDirection {
case .East:
print("East")
case .South:
print("South")
case .West:
print("West")
case .North:
print("North")
case .NorthWest, .EastSouth:
print("Other")
default:
print("Default")
}

PART_B 关联值

  1. 定义:将枚举成员使用元组组合成关联值
  2. 注意:同一变量可被分配成不同类型的关联值,但同一时刻仅能存储为一种类型
  3. 语法格式
enum Person {
case Male(String, Int)
case Female(String, String)
}

func test() {
var p1 = Person.Male("zhangsan", 28)

switch p1 {
case .Male(let name, let age):
print("\(name), \(age)")

// 元组成员类型相同时,可提出类型至case后面
case let .Female(name, desc):
print("\(name), \(desc)")
}
}

PART_C1 原始值:原始值的类型必须相同

  1. 定义:即默认值. 对于一个特定的枚举成员,其原始值始终不变
  2. 说明
  • 原始值类型可为字符、字符串、任意整型值、任意浮点型值
  • 每个原始值在枚举声明中必须是唯一的
  • 系统提供方法获取原始值:rawValue
  1. 语法格式
enum OriginStr: String {
case str1 = "hi"
case str2 = "how are you"
}

PART_C2 原始值的隐式赋值

  1. 当使用整数作为原始值,隐式赋值依次递增1. 若第一个枚举成员未设置原始值,默认为0
  2. 当使用字符串作为原始值,每个枚举成员的隐式原始值为该枚举成员的名称
// 枚举类型一、星球(整型)
enum Planet: Int {
case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

// 枚举类型二、方位(字符串)
enum CompassPoint: String {
case North, South, East, West
}

// 使用 rawValue 取默认原始值
let earthsOrder = Planet.Earth.rawValue // earthOrder 值为 3
  1. 使用原始值初始化枚举实例
let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet类型为可选值:Planet?
// 越界将返回 nil,否则将对应星球赋值给 possiblePlanet

PART_D 递归枚举(indirect):情况可被穷举时,适合数据建模

以下为解决案例:​​(3 + 4) * 5​

  1. 定义
  • 方式一
enum ArithmeticExpression {
case Num(Int)
indirect case Add(ArithmeticExpression, ArithmeticExpression)
indirect case Multiple(ArithmeticExpression, ArithmeticExpression)
}
  • 方式二:所有成员可递归时,将 indirect 放在 ​enum​ 声明前
indirect enum ArithmeticExpression2 {
case Num(Int)
case Add(ArithmeticExpression, ArithmeticExpression)
case Multiple(ArithmeticExpression, ArithmeticExpression)
}
// 定义运算方法
func test(expression: ArithmeticExpression) -> Int {
switch expression {
case let .Num(value):
return value
case let .Add(a, b):
return test11(a) + test11(b)
case let .Multiple(a, b):
return test11(a) * test11(b)
}
}
// 调用运算方法、递归枚举进行运算
let three = ArithmeticExpression.Num(3)
let four = ArithmeticExpression.Num(4)
let sum = ArithmeticExpression.Add(three, four)
let result = ArithmeticExpression.Multiple(sum, ArithmeticExpression.Num(5))
// result 值为 35


标签:case,enum,ArithmeticExpression,枚举,let,006,print,Swift
From: https://blog.51cto.com/u_15950249/6031343

相关文章

  • Swift开篇007->类和结构体
    PART_A类&结构体对比共同点定义属性:存储值定义方法:提供功能定义附属脚本:访问值定义构造器:生成初始化值通过扩展增加默认实现的功能实现协议以提供某种标准功能类的附加功能......
  • Swift开篇009->方法
    PART_A实例方法简介实例方法:可属于某个特定类、结构体或枚举实例的方法实例方法能隐式访问它所属类型的所有其他实例方法和属性实例方法只能被它所属的类的某个特定实例调......
  • Swift开篇004->集合
    PART_O集合简介集合长度默认可变,若分配成常量,则其大小和内容皆不可变Swift集合类型(必须通过泛型明确存储值)​​Arrays​​:数组,有序可重复​​Sets​​:集合,无序不重复​​......
  • Swift开篇005->闭包
    PART_A背景闭包的概念:自包含的函数代码块,可以在代码中被传递和使用.用简洁语法构建内联闭包闭包的三种形式全局函数是一个有名字但不会捕获任何值的闭包嵌套函数是一个有......
  • Swift开篇003->控制流、函数
    PART_A控制流​​for​​​​for...in​​forindexin1...5{print(index)}letnames=["cat","dog","fish"]fornameinnames{print(name)}letnums=......
  • Swift开篇001->新建Swift工程
    最近看了点​​Swift的教程​​,在此做个笔记,那就从Xcode新建一个Swift工程开始吧​​File->New->Project​​​​OSX->Application->CommandLineTool​​​​填......
  • Swift开篇002->基本运算符
    PART_A运算符赋值运算符:​​=​​普通赋值varnumnum=5元组赋值let(x,y)=(0,0)​​=​​操作不返回任何值算数、组合赋值、自增自减、、负号、字符串拼接求余时符号......
  • AcWing 94. 递归实现排列型枚举
    顺序1:枚举每个数要放入哪个位置查看代码//暂时不想写顺序1:时间复杂度 顺序2:枚举每个位置要放哪个数相关题:AcWing1209.带分数查看代码#include<cstdio>#inc......
  • [oeasy]python0068_控制序列_清屏_控制输出位置_2J
    光标位置回忆上次内容上次了解了键盘演化的过程ESC从组合键到独立按键ESC的目的是进入控制序列配置控制信息控制信息\033[y;xH设置光标位置\033[2J清屏这到底​​......
  • AcWing 92. 递归实现指数型枚举
    /*相关词:递归,递归搜索树,深搜*/#include<cstdio>#include<cstring>#include<iostream>usingnamespacestd;constintN=16;intarr[N];//0:还没考虑。1:选。2:不......