枚举

2019-06-24  本文已影响0人  曹来东

枚举概述

枚举的基本用法

enum Direction {
    case north,south,east,west
}
enum Direction {
      case  north
      case  south
      case  east
      case  west
}
//以上两种写法完全等价
var dir = Direction.west
dir = Direction.south
dir = .east


switch dir {
case .north:
    print("north")
case .south:
    print("south")
case .west:
    print("west")
case .east:
    print("east")
}

枚举关联值(Associated Values)

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)
}
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(var year, month: let month, day: let day):
        if year == 2018 {
            year += 1
        }
        print(year,month,day)
    
    case let .string(value):
        print(value)
    
}

关联值举例

enum Password {
    case number(Int, Int, Int, Int)
    case gesture(String)
}
var pwd = Password.number(3, 1, 2, 0)
pwd = .gesture("221323")

switch pwd {
case let .number(n1, n2, n3, n4):
    print("number is",n1,n2,n3,n4)
case let .gesture(str):
    print("gesture is",str)
}

原始值(Raw Values)

enum PokerSuit: Character {
    case smile = "😀"
    case laugh = "😄"
    case cry = "😂"
    case other = "😍"
}
var suit = PokerSuit.smile
print(suit)
print(suit.rawValue)
print(PokerSuit.cry.rawValue)
image.png

隐式原始值(Implicity Assigned Raw Values)

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


enum Season : Int{
    case spring,summer,autumn,winter
}
print(Season.spring)//spring
print(Season.summer)//summer
print(Season.autumn)//autumn
print(Season.winter)//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 = 5,winter
}

print(Season.spring.rawValue)//1
print(Season.summer.rawValue)//2
print(Season.autumn.rawValue)//5
print(Season.winter.rawValue)//6

递归枚举(Recursive Enumeration)

indirect enum ArithExpr {
    case number(Int)
    case sum(ArithExpr,ArithExpr)
    case difference((ArithExpr,ArithExpr))
}

enum ArithExpr {
    case number(Int)
    indirect case sum(ArithExpr,ArithExpr)
    indirect case difference((ArithExpr,ArithExpr))
}
//以上为等价写法
let five = ArithExpr.number(5)
let four = ArithExpr.number(4)
let two = ArithExpr.number(2)
let sum = ArithExpr.sum(five, four)
let diff = ArithExpr.difference(sum,two)
func calculate(_ expr: ArithExpr) -> Int {
    switch expr {
    case let .number(value):
        return value
    case .sum(let left , let right)://  5 + 4 = 9
        return calculate(left) + calculate(right)
        
    case let .difference(left, right):// 9 - 2
        return calculate(left) -  calculate(right)
    }
}
calculate(diff)// 9 - 2 = 7

MemoryLayout

enum Password {
    case none//1
    case number(Int, Int, Int, Int)//32
    case gesture(String)//16
    case otherPassword//1
}
MemoryLayout<Password>.stride//40 系统分配的空间
MemoryLayout<Password>.size//33 实际占用的空间
MemoryLayout<Password>.alignment//8 对齐参数


enum Password {
    case none//1
//    case number(Int, Int, Int, Int)//32
    case gesture(String)//16
    case otherPassword//1
}
MemoryLayout<Password>.stride//16 系统分配的空间
MemoryLayout<Password>.size//16 实际占用的空间
MemoryLayout<Password>.alignment//8 对齐参数


enum Password {
    case none//1
    case number(Int, Int, Int, Int)//32
    case gesture(String)//16
    case otherPassword//1
}

var pas = Password.none
MemoryLayout.stride(ofValue: pas)//40 系统分配的空间
MemoryLayout.size(ofValue: pas)//33 实际占用的空间
MemoryLayout.alignment(ofValue: pas)//8 对齐参数

MemoryLayout<Password>.stride//40 系统分配的空间
MemoryLayout<Password>.size//33 实际占用的空间
MemoryLayout<Password>.alignment//8 对齐参数

enum Password {
    case none//1
//    case number(Int, Int, Int, Int)//32
    case gesture(String)//16
    case otherPassword//1
}

var pas = Password.none
MemoryLayout.stride(ofValue: pas)//16 系统分配的空间
MemoryLayout.size(ofValue: pas)//16 实际占用的空间
MemoryLayout.alignment(ofValue: pas)//8 对齐参数

MemoryLayout<Password>.stride//16 系统分配的空间
MemoryLayout<Password>.size//16 实际占用的空间
MemoryLayout<Password>.alignment//8 对齐参数

enum Password {
    case none//1
//    case number(Int, Int, Int, Int)//32
    case gesture(String)//16
    case otherPassword//1
}

var pas = Password.gesture("2222")
MemoryLayout.stride(ofValue: pas)//16 系统分配的空间
MemoryLayout.size(ofValue: pas)//16 实际占用的空间
MemoryLayout.alignment(ofValue: pas)//8 对齐参数

MemoryLayout<Password>.stride//16 系统分配的空间
MemoryLayout<Password>.size//16 实际占用的空间
MemoryLayout<Password>.alignment//8 对齐参数

上一篇 下一篇

猜你喜欢

热点阅读