IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Swift 枚举详解(代码) -> 正文阅读

[移动开发]Swift 枚举详解(代码)

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

枚举源码地址

基本的枚举类型
注意:与C和Objective-C不同,Swift枚举情况在创建时不分配默认整数值。在Weight例子中,light,Mid和Heavy不等于隐式0,1和2。

enum Weight {
    case light
    case mid
    case heavy
}

使用

let weight = Weight.light
print("weight: \(weight)")

打印结果
在这里插入图片描述
OC的枚举值只支持Int一种类型,Swift的枚举值支持四种类型
对于Int类型的枚举

enum Age: Int {
    case young = 0
    case middle = 1
    case old = 2
}
 let age = Age.young
        print("age: \(age)")

在这里插入图片描述
上面的代码有一个缩写的方法

enum Age : Int {
     case young ,middle , old
}

let age = Age.old

使用枚举的rawValue属性来访问其原始值:

let ageRawValue = Age.old.rawValue	

对于字符串类型的枚举成员,举例如下:

enum DogName:String {
    case taidi = "taidi"
    case fadou = "fadou"
    case xiaogou = "xiaogou"
}
let name = DogName.taidi
print("name: \(name)")

在这里插入图片描述
上面的例子对于字符串的枚举成员,隐式原始值为该枚举成员变量的名称,不过它规定要int类型才行

enum DogNname:Int {
    case taidi
    case fadou
    case xiaogou
    case guibing
}
let dogName = DogNname(rawValue: 3)
print("douName: \(dogName!)")

在这里插入图片描述
嵌套枚举

enum Dog {
    enum Food {
        case noodles
        case dumpling
        case meat
    }
    enum Toys {
        case basketBall
        case footBall
    }
    case taidis
    case fanius
}


let pet = Dog.taidis
print("pet: \(pet)")

let food = Dog.Food.dumpling
print("food: \(food)")

let toys = Dog.Toys.basketBall
print("toys: \(toys)")

在这里插入图片描述
迭代枚举(die dai)

enum Cat:CaseIterable {
  case bigCat
  case middleCat
  case oldCat
}
let numOfDogKind = Cat.allCases.count
print("numOfDogKind = \(numOfDogKind)")

在这里插入图片描述

for dogKind in Cat.allCases{
	print(dogKind)
}

在这里插入图片描述
关联值
我们可以定义Swift枚举来存储任何给定类型的关联值,而且每种枚举情况的值类型可以不同。

enum Pet{
    //名字和年龄
    case dog(String,Int)
    //体重
    case cat(Float)
}
var result = Pet.dog("老七", 3)
result = Pet.cat(2.0)
print(result)//cat(2.0)

在这里插入图片描述

switch result {
case .dog(let name, let age):
    print("dog: name = \(name), age = \(age).")
case .cat(let weight):
    print("cat: weight = \(weight)公斤")//cat: weight = 2.0公斤
}

在这里插入图片描述
如果一个枚举成员的所有关联值都被提取为常量,或者都被提取为变量,为了简洁,你可以只在成员名称前标注一个let或者var:

var result = Pet.dog("老七", 3)
result = Pet.cat(2.0)
switch result {
case let .dog(name,age):
    print("dog: name = \(name), age = \(age).")
case let .cat(weight):
    print("cat: weight = \(weight)公斤")
}

包含枚举: 同样地,你也能够在structs或classes中内嵌枚举。举例:

 struct DaDog {
    enum DogKind {
        case jinmao
        case taiji
        case fadou
    }
    enum Food {
        case noodles
        case dumpling
        case meat
    }
    let kind : DogKind
    let food : Food
 }
let dog = DaDog(kind: .fadou, food: .dumpling);
print(dog.kind)

在这里插入图片描述

方法和属性

enum Device {
    case iPad, iPhone, AppleTV, AppleWatch
    
    func introduced() -> String {
        switch self {
        case .iPad: return "iPad"
        case .iPhone: return "iPhone"
        case .AppleWatch: return "AppleWatch"
        case .AppleTV: return "AppleTV"
        }
    }
    
}

很清晰,我们定义了一个设备枚举,有iPad, iPhone, AppleTV, AppleWatch,还有一个介绍的方法。这里的introduced方法,你可以认为枚举是一个类,introduced是一个成员方法,Device.iPhone就是一个Device的实例,case们是他的属性,好了,有了这个对像,Device.iPhone可以认为,Device里面有一个匿名属性,现在设置这个属性为iPhone。好了,introduced里面的switch self,其实就是遍历这个匿名属性的所有场景,如iPad,iPhone等,然后根据不同的场景返回不同的值。

print(Device.iPhone.introduced())

在这里插入图片描述

属性

增加一个存储属性到枚举中不被允许,但你依然能够创建计算属性。当然,计算属性的内容都是建立在枚举值下或者枚举关联值得到的。

 enum Devices {
     case iPads, iPhones
     
     var year: Int {
         switch self {
         case .iPhones: return 2007
         case .iPads: return 2010
         }
     }
 }
print(Devices.iPhones.year)

在这里插入图片描述
静态方法

  enum Device {
      case iPad, iPhone, AppleTV, AppleWatch
      
      func introduced() -> String {
          switch self {
          case .iPad: return "iPads"
          case .iPhone: return "iPhones"
          case .AppleWatch: return "AppleWatchs"
          case .AppleTV: return "AppleTVs"
          }
      }

      static func fromSlang(term: String) -> Device? {
          if term == "iWatch" {
              return .AppleWatch
          }
          return nil
      }
  }
print(Device.fromSlang(term: "iWatch"))

在这里插入图片描述

Swift也允许你在枚举中使用协议(Protocols)和协议扩展(Protocol Extension)。
Swift协议定义一个接口或类型以供其他数据结构来遵循。enum当然也不例外。我们先从Swift标准库中的一个例子开始.
CustomStringConvertible是一个以打印为目的的自定义格式化输出的类型。

该协议只有一个要求,即一个只读(getter)类型的字符串(String类型)。我们可以很容易为enum实现这个协议。

protocol CustomStringConvertible {
	var description: String { get }
}

enum Trade :CustomStringConvertible{
    case Buy(stock:String,amount:Int)
    case Sell(stock:String,amount:Int)

    var description: String {

        switch self {
        case .Buy(_, _):
            return "Buy"

        case .Sell(_, _):
            return "Sell"
        }
    }
}
print(Trade.Buy(stock: "003100", amount: 100).description)

在这里插入图片描述

扩展

枚举也可以进行扩展。最明显的用例就是将枚举的case和method分离,这样阅读你的代码能够简单快速地消化掉enum内容,紧接着转移到方法定义:
在这里插入图片描述

import Foundation

enum Device {
    case iPad, iPhone, AppleTV, AppleWatch
    
}

extension Device: CustomStringConvertible{
    
    func introduced() -> String {
        
        switch self {
        case .iPad: return "iPad"
        case .iPhone: return "iPhone"
        case .AppleWatch: return "AppleWatch"
        case .AppleTV: return "AppleTV"
        }
    }
 
    var description: String {
        
        switch self {
        case .iPad: return "iPad"
        case .iPhone: return "iPhone"
        case .AppleWatch: return "AppleWatch"
        case .AppleTV: return "AppleTV"
        }
    }
}

使用

print("introduced: \(Device.iPad.introduced())")

print("description: \(Device.iPad.description)")

在这里插入图片描述

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:12:54  更:2022-04-15 00:13:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 21:07:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码