一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。
枚举源码地址
基本的枚举类型 注意:与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)")
|