swift学习日记(四) 枚举 类

来源:互联网 发布:淘宝dnf稀有装扮兑换券 编辑:程序博客网 时间:2024/06/01 08:32

又到深夜了,不过还是尽量保持每天一篇的节奏


一,枚举

1,
从任何角度,任何语言看,枚举都不是什么难点
稍有不同的是,swift的枚举更接近“类”
先贴代码
enum CompassPoint {    case North    case South    case East    case West}var directionToHead = CompassPoint.SouthdirectionToHead = .Northswitch directionToHead {case .North:    print("Lots of planets have a north")case .South:    print("Watch out for penguins")case .East:    print("Where the sun rises")case .West:    print("Where the skies are blue")}

枚举的声明定义就是使用 enum 关键字,使用 case 关键字 声明枚举里面的值
swift的枚举不是把枚举的值映射到数字,而是苹果自己定义的数据类型
如果是同一枚举类型内的赋值,则可以简写成
directionToHead = .North


2,关联值
swift还将枚举类型赋予了一些原本c++中union类型的特性,比如如下

enum Barcode {    case UPCA(Int, Int, Int)    case QRCode(String)}var productBarcode = Barcode.UPCA(8, 85909_51226, 3)switch productBarcode {case .UPCA(let numberSystem, let identifier, let check):    print("UPC-A with value of \(numberSystem), \(identifier), \(check).")case .QRCode(let productCode):    print("QR code with value of \(productCode).")}

枚举类型不仅可以为自定义的值,还可以为其定义一个“关联值”,这个值可以被初始化为一定结构的关联值
此时枚举里面每一个值都有一个自己的数据结构,他们本身还被认为是一个变量
按我的理解,其实这里枚举的值已经可以看作是一个数组了

3,初始值
和参数一样,枚举类型也可以有初始值,这个很简单
enum ASCIIControlCharacter: Character {    case Tab = "\t"    case LineFeed = "\n"    case CarriageReturn = "\r"}

注意,初始值跟关联值略有不同,初始值就是该值被存储的值,关联值还会被影射成其它类型的值

原始值可以是字符串,字符,或任何整数或浮点数类型。每个原始值必须在它的枚举中唯一声明。当整数被用于原始值,如果其他​​枚举成员没有值时,它们自动递增。

比如

enum Planet: Int {    case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune}

后面的枚举值从2递增

就这么多

二,类

上面提到swift的枚举跟类已经有点像了,下面就是类
class family {    init(s:String, d:String, m:String) {        son = s        dad = d        mom = m    }    var son = "Default"    var dad = "Default"    var mom = "Default"}var Dumphy = family(s: "Luke", d: "Phil", m: "Clair")


与c++不同的是
1,类的构造函数使用init,而不是与类名同名的函数
2,构造函数的调用有点类似于函数的外部参数
3,据我测试,构造函数必须要有类型,虽然swift是弱类型语言,但是其处处都表露出强类型语言的规范
类最大的用处还是它的方法

强烈注意:swift的类是引用类型

也就是说,一个实例化的类,无论被复制多少次,修改的都是这个实例的值,所以引用它的变量都会变

与之对比的是,枚举类型是数值类型,当其被复制时,复制后的变量与原本的变量就毫无关系了

如果需要使用数值类型,请使用结构体,具体方法跟c++中类与结构体的区别类似,各位请自学

还是贴一段代码看看吧

class family {    init(s: String, d:String, m:String) {        son = s        dad = d        mom = m    }    var son = "Default"    var dad = "Default"    var mom = "Default"}var Dumphy = family(s: "Luke", d: "Phil", m: "Clair")var Pre = DumphyPre.son = "Mitch"print(Dumphy.son) // output: Mitch

如果需要深拷贝,我暂时想到的方法还是再实例化一个新对象,暂时想不到其它办法

虽然我还没开始做开发,但是可预见到,这会是个大坑

今天就到这了
0 0