美文网首页
swift 5.0 枚举

swift 5.0 枚举

作者: 木子雨廷t | 来源:发表于2020-09-02 15:29 被阅读0次
随着swift语言的不断发展,越来越来趋于稳定化。现在也有很多公司使用swift来开发新的App,那么不会swift开发的iOS开发者在竞争中还是很弱势的,所有学习swift是大势所趋。本系列文章根据以往的学习积累和项目经验,从基础到原理详细说说swift的这点事儿,不喜勿喷,交流指正请加微信。
WeChatdfdb8bfa7f0a84545d010ef18af70a98.png
一. 枚举的基本用法
enum Direction {
    case north
    case south
    case east
    case west
}
也可以写成一行
enum Direction {
    case north, south, east, west
}
给枚举进行赋值
var dir = Direction.west
dir = Direction.east
dir = .north
print(dir)
 // north 如果已知枚举的类型,Direction可以省略
枚举用switch进行判断
switch dir {
    case .north:
        print("north")
    case .south:
        print("south")
    case .east:
        print("east")
    case .west:
        print("west")
}
二. 关联值
有时将枚举的成员值跟其他类型的值关联存储在一起,会非常有用
enum Score {
    case points(Int)
    case grade(Character)
}

var score = Score.points(96)
score = .grade("A")

switch score {
    case let .points(i):
        print(i, "points")
    case let .grade(i):
        print("grade", i)
}
// grade A
枚举的成员值跟其他类型的值关联存储在一起,应用举例。
如果你有一个时间显示控件,可以显示年月日,就是xxxx-xx-xx这种样式,也可以显示自定义字符串类型,用下面的代码进行判断是不是更加的方便。
enum Date {
    case digit(year: Int, month: Int, day: Int)
    case string(String)
}

var date = Date.digit(year: 2011, month: 9, day: 10)
date = .string("2011-09-10")
switch date {
    case .digit(let year, let month, let day):
        print(year, month, day)
    case let .string(value):
        print(value)
}

必要时let也可以改为var
三. 原始值
枚举成员可以使用相同类型的默认值预先对应,这个默认值叫做:原始值
enum Grade : String {
    case perfect = "A"
    case great = "B"
    case good = "C"
    case bad = "D"
}
print(Grade.perfect.rawValue) // A
print(Grade.great.rawValue) // B
print(Grade.good.rawValue) // C
print(Grade.bad.rawValue) // D

注意:原始值不占用枚举变量的内存

原始值的应用举例
Alamofire swift版AFN
Alamofire
四. 隐式原始值
如果枚举的原始值类型是Int、String,Swift会自动分配原始值
下面的两段代码效果一样
enum Direction : String {
    case north = "north"
    case south = "south"
    case east = "east"
    case west = "west"
}

// 等价于
enum Direction : String {
    case north, south, east, west
}
print(Direction.north) // north
print(Direction.north.rawValue) // north

我们指定了 Direction 是字符串类型,系统会默认生成原始值,所以上面的两段代码效果一样

enum Season : Int {
    case spring, summer, autumn, winter
}
print(Season.spring.rawValue) // 0
print(Season.summer.rawValue) // 1
print(Season.autumn.rawValue) // 2
print(Season.winter.rawValue) // 3

// 等价于
enum Season : Int {
    case spring = 1, summer, autumn = 4, winter
}
print(Season.spring.rawValue) // 1
print(Season.summer.rawValue) // 2
print(Season.autumn.rawValue) // 4
print(Season.winter.rawValue) // 5

我们指定了 Season 是Int类型,系统会默认生成原始值,系统会从0开始,如果第一个赋值的不是0,中间的会按照顺序生成

五. 递归枚举
递归枚举是拥有另一个枚举作为枚举成员关联值的枚举,实际上就是Swift中枚举关联值的特性和递归算法在Swift开发中的运用。
定义递归枚举时,需要使用indirect关键字明确枚举成员它是可以递归的。
enum ArithmeticExpression { 
    case number(Int) 
    indirect case addition(ArithmeticExpression, ArithmeticExpression) 
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression) 
}

可以在枚举之前写indirect来让整个枚举成员在需要时可以递归:

indirect enum ArithmeticExpression {
    case number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)
}
举例说明:

以下代码使用ArithmeticExpression枚举类型定义枚举常量对数学表达式5、4、2、5 + 4、(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))

以下函数通过对上述枚举常量的判断从而求出对应的数学表达式的值。

func evaluate(_ expression: ArithmeticExpression) -> Int {
    switch expression {
    case let .number(value):
        return value
    case let .addition(left, right):
        return evaluate(left) + evaluate(right)
    case let .multiplication(left, right):
        return evaluate(left) * evaluate(right)
    }
}
print(evaluate(five))    // 打印 "5"
print(evaluate(four))    // 打印 "4"
print(evaluate(sum))     // 打印 "9"
print(evaluate(product)) // 打印 "18"

关于swift的更多知识
请点击 swift文集!

相关文章

  • swift 5.0 枚举

    随着swift语言的不断发展,越来越来趋于稳定化。现在也有很多公司使用swift来开发新的App,那么不会swif...

  • Swift 基础笔记 - 枚举

    枚举 OC定义和使用枚举 Swift定义枚举类型 Swift判断枚举类型 枚举成员类型

  • Swift5.0新特性更新

    原文博客地址: Swift 5.0新特性更新 期待已久的Swift 5.0终于来啦, Swift 5.0是Swif...

  • Swift与OC的语法简单对比(常用语法二)

    20- 枚举,枚举原始值,枚举相关值,switch提取枚举关联值 Swift枚举: Swift中的枚举比OC中的枚...

  • Swift - 枚举

    Swift - 枚举 枚举在C和Swift中有所不同, Swift中的枚举, 更加灵活, 更加强大 C 值类型: ...

  • Swift基础语法-枚举,枚举原始值,枚举相关值,switch提

    1. Swift枚举基本概念 Swift中的枚举比OC中的枚举强大, 因为Swift中的枚举是一等类型, 它可以像...

  • Swift枚举高级用法(Enum)

    关于swift的枚举 一 swift对于枚举的扩展性(Enum) 枚举的继承(继承任何类和协议,目前除了swift...

  • swift3.0- 枚举

    Swift枚举 Swift中的枚举比OC中的枚举强大, 因为Swift中的枚举是一等类型, 它可以像类和结构体一样...

  • 枚举

    Swift枚举:Swift中的枚举比OC中的枚举强大, 因为Swift中的枚举是一等类型, 它可以像类和结构体一样...

  • 谈谈Swift中的枚举内存布局

    谈谈Swift中的枚举内存布局谈谈Swift中的枚举内存布局

网友评论

      本文标题:swift 5.0 枚举

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