Swift基础入门(6):枚举,类和结构体

文章目录
  1. 1. 枚举
    1. 1.1. 枚举语法
    2. 1.2. 成员值
    3. 1.3. 相关值
  2. 2. 类和结构体

本篇介绍Swift的基础知识:枚举,类和结构体的基本概念和语法。

Title: Swift基础入门(6):枚举,类和结构体
Author: Yunyao Zhang(张云尧)
E-mail: aidaizyy@gmail.com
Last Modified: 2015-07-24

枚举

枚举语法

枚举定义了一个通用来兴的一组相关的值。

1
2
3
4
5
enum CompassPoint {
case North, South
case East
case West
}

enum关键字把枚举的整个定义放在大括号中,CompassPoint是它的名称。case表明新的一行成员值被定义,同一行中可以定义多个成员值,用,隔开,这里的成员值为NorthSouthEastWest

1
2
var directionToHead = CompassPoint.West
directionToHead = .East

变量的类型经过第一次赋值确定后,再次赋值可省略枚举类型名称,这里directionToHead已经被确定为CompassPoint的成员值,再次赋值用.East的形式就可以了。
定义的枚举成员是没有值的,不会自动分配值。后面会介绍存储原始值,不仅可以存储整数,也可以存储浮点数字符串等其他类型。

成员值

枚举类型用switch匹配时,必须每个成员值都考虑到,否则编译无法通过,可用default替代其他成员值。

1
2
3
4
5
6
7
8
9
10
11
12
directionToHead = .South
switch directionToHead {
case .North:
println("Lots of planets have a north")
case .South:
println("Watch out for penguins")
case .East:
println("Where the sun rises")
case .West:
println("Where the skies are blue")
}
// 输出 "Watch out for penguins”

相关值

枚举类型的用法比较像C语言中的联合体(union),可以为成员值提供其他类型的相关值,即成员值之外的自定义信息。
相关值可以是任何类型,每个成员的数据类型也可以不一样。

1
2
3
4
enum Barcode {
case UPCA(Int, Int, Int)
case QRCode(String)
}

枚举类型Barcode有两个成员值,一个是UPCA,它的相关值是(Int, Int, int),一个是QRCode,它的相关值是(String)

1
2
var productBarcode = Barcode.UPCA(8, 85909_51226, 3)
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")

类和结构体

类(Class)和结构体(Struct)的用法和其他语言类似。
主要区别在于,类允许继承,而结构体不行;类是引用传递,而结构体是值传递。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
var someResolution = Resolution(width: 1920, height: 1080)
let someVideoMode = VideoMode()
someVideoMode.resolution = someResolution;
someVideoMode.interlaced = true;
someVideoMode.name = "1080i"
someVideoMode.frameRate = 25.0
var otherResolution = someResolution;
let otherVideoMode = someVideoMode;
someResolution.width = 2048
println("someResolution is now \(someResolution.width) pixels wide")
// 输出 "someResolution is now 2048 pixels wide"
println("otherResolution is now \(otherResolution.width) pixels wide")
// 输出 "otherResolution is now 1920 pixels wide"
someVideoMode.resolution.width = 1280
println("The width of someVideoMode is now \(someVideoMode.resolution.width)")
// 输出 "The width of someVideoMode is now 1280"
println("The width of otherVideoMode is now \(otherVideoMode.resolution.width)")
// 输出 "The width of otherVideoMode is now 1280"
if someVideoMode === otherVideoMode {
println("someVideoMode and otherVideoMode refer to the same VideoMode instance.")
}
//输出 "someVideoMode and otherVideoMode refer to the same VideoMode instance."

第1-10行是类和结构体的定义,分别用classstruct表示。

第12-17行是给类和结构体创建实例,并赋值。
结构体可以在构造时逐一初始化成员,(width: 1920, height: 1080),而类不可以。

第19-20行,分别用类和结构体的实例去赋值变量或常量。

第22-26行,变量otherResolution被结构体someResolution赋值时采用的是值传递,因此相互是独立的,只是成员值一样。
改变了someResolutin的属性width的值后,otherResolution并未受到影响。

第28-32行,常量otherVideoMode被类otherVideoMode赋值时采用的是引用传递,指向的是同一个对象。
改变了someVideoMode的属性reoulution.width的值后,otherVideoMode的相应属性也随之变化。
someVideoModeotherVideoMode被声明为常量,也可以改变其中的成员属性:
因为他们都不存储实例,只存储了引用对象,没有改变引用对象,只改变了被引用的基础VideoMode的成员属性。
Swift中,几乎所有的基本类型,包括字符串,数组和字典等都是值传递。

第34-37行,因为两者指向同一对象,不仅仅是成员值相等的关系了,==等于符号并不足以描述这样的关系。
====恒等运算符用来形容两者指向同一对象,表示两个实例等价。

枚举,类和结构体的其他特性,参见:
Swift基础入门(7):属性,方法和下标
Swift基础入门(8):继承,构造,析构和嵌套类型

转载请注明原作者和出处。

如果觉得这篇文章对您有帮助或启发,请随意打赏~