1
1
# 类型
2
2
在swift里,有两种类型:命名类型和复合类型。命名类型是指在定义的时候能够给一个指定名字的类型。命名类型包含类、结构、枚举和协议。例如,一个用户自定义的名为MyClass的类的实例,其类型就是MyClass。除了用户定义的命名类型,swift标准库还定义了很多常用命名类型,如一些数组,字典,可选值。
3
3
4
- 一些被其它语言视为是最基础或最原始的数据类型,例如数字、字符、字符串,实际上都是命名类型,swift标准库使用结构去定义和实现他们。由于他们是命名类型的,你可以用扩展声明来扩展他们的功能,来满足你的程序需求,具体请参考‘ 扩展和扩展声明’ 。
4
+ 一些被其它语言视为是最基础或最原始的数据类型,例如数字、字符、字符串,实际上都是命名类型,swift标准库使用结构去定义和实现他们。由于他们是命名类型的,你可以用扩展声明来扩展他们的功能,来满足你的程序需求,具体请参考 “ 扩展和扩展声明“ 。
5
5
6
- 复合类型是一个没有名字的类型,由swift内部自己定义。swift有两种复合类型:函数类型和元组类型。一个复合数据类型可以包含命名类型和其他复合类型。例如,一个元组类型(Int, (Int, Int))包含两个元素:第一个是命名类型Int,第二个是另外一个复合类型 (Int, Int)。
6
+ 复合类型是一个没有名字的类型,由swift内部自己定义。swift有两种复合类型:函数类型和元组类型。一个复合数据类型可以包含命名类型和其他复合类型。例如,一个元组类型(Int, (Int, Int))包含两个元素:第一个的命名类型是Int,第二个是其他复合类型 (Int, Int)。
7
7
8
8
本章讨论swift语言本身定义的类型,并描述在swift中类型推断的方式。
9
9
34
34
## 类型标识符
35
35
36
36
37
- 类型标识符是指一个命名类型或者说命名类型 /复合类型的别名。
37
+ 类型标识符是指一个命名类型或者命名类型 /复合类型的别名。
38
38
39
39
40
- 大多数情况下,类型标识符直接指向和标示符命名相同的命名类型。例如,类型标识符Int指向命名类型Int, 类型标识符Dictionary指向命名类型Dictionary。
40
+ 大多数情况下,类型标识符直接指向和标示符命名相同的命名类型。例如,类型标识符Int指向命名类型Int, 类型标识符Dictionary指向命名类型Dictionary。
41
41
42
42
43
43
命名标识符和类型标识符不同名有两种情况。第一种情况,命名标识符指向命名类型或者复合类型的别名。例如,在下面的例子中,类型标识符使用Point指向元组类型(Int, Int)。
62
62
元组类型是指在括号中,用逗号分隔的零到多个类型的列表。
63
63
64
64
65
- 你可以用元组类型作为函数的返回值类型,这样函数就能返回包含多个值的单元组。你也可以给元组类型中的元素命名,用这些名字来指代单个元素的值。元素的名字由标识符和紧跟着的冒号(:)组成。关于这两种特性的具体用法,请看 ‘ 多个返回值的函数’ 。
65
+ 你可以用元组类型作为函数的返回值类型,这样函数就能返回包含多个值的单元组。你也可以给元组类型中的元素命名,用这些名字来指代单个元素的值。元素的名字由标识符和紧跟着的冒号(:)组成。关于这两种特性的具体用法,请看 “ 多个返回值的函数“ 。
66
66
67
- Void是空元组类型的别名,表示为()。如果在括号里面只有一个元素,那么这个类型就是这个元素的类型。例如, (Int)的类型是Int,不是(Int)。因此,你可以认为仅当元组类型包含两个或者更多元素的时候才是元组元素。
67
+ Void是空元组类型的别名,表示为()。如果在括号里面只有一个元素,那么这个类型就是这个元素的类型。例如, (Int)的类型是Int,不是(Int)。因此,你可以认为仅当元组类型包含两个或者更多元素的时候才是元组元素。
68
68
69
69
70
70
> 元组类型的语法
@@ -92,7 +92,7 @@ Void是空元组类型的别名,表示为()。如果在括号里面只有一
92
92
93
93
由于参数类型和返回类型都可以为元组类型,所以函数类型支持含有多个参数和多个返回值的函数和方法。
94
94
95
- 你可以把自动闭包(auto_closure)的属性归为有一个参数类型为(),返回值为表达式类型(请看 ‘ 类型属性’) 。一个自动闭包函数捕获的是指定表达式上的隐式闭包而不是表达式本身。下面的例子用auto_closure属性来定义一个简单的assert函数:
95
+ 你可以把自动闭包(auto_closure)的属性归为有一个参数类型为(),返回值为表达式类型(请看 “ 类型属性“)的函数类型 。一个自动闭包函数捕获的是指定表达式上的隐式闭包而不是表达式本身。下面的例子用auto_closure属性来定义一个简单的assert函数:
96
96
97
97
func simpleAssert(condition: @auto_closure () -> Bool, message: String){
98
98
if !condition(){
@@ -105,7 +105,7 @@ Void是空元组类型的别名,表示为()。如果在括号里面只有一
105
105
106
106
107
107
108
- 一个函数类型在参数类型中可以让一个可变参数作为其最后一个参数。从语法上来说,可变参数可以由一个基础类型名称和紧跟着的三个点(...)组成,例如Int...。可变参数被认为是一个包含基础类型名称的数组。例如,可变参数Int... 被认为是Int[ ] 。使用可变参数的例子,请参考 ‘ 可变参数’ 。
108
+ 一个函数类型在参数类型中可以让一个可变参数作为其最后一个参数。从语法上来说,可变参数可以由一个基础类型名称和紧跟着的三个点(...)组成,例如Int...。可变参数被认为是一个包含基础类型名称的数组。例如,可变参数Int... 被认为是Int[ ] 。使用可变参数的例子,请参考 “ 可变参数“ 。
109
109
110
110
111
111
指定一个in-out参数,需要给参数类型加上inout的前缀。可变参数和返回类型不能使用inout标记。in-out参数在’In-Out参数‘中有讨论。
@@ -161,7 +161,7 @@ Void是空元组类型的别名,表示为()。如果在括号里面只有一
161
161
当访问多维数组里面的元素时,最左边的下标指向数组最外层对应位置的元素,接下来往右的下标指向第一层嵌套的数组相应位置的元素。依此类推。根据上面的定义,则array3D[ 0] 指向[[ 1, 2] , [ 3, 4]] ,array3D[ 0] [ 1 ] 指向[ 3, 4] ,array3D[ 0] [ 1 ] [ 1] 的值是4。
162
162
163
163
164
- 想要更多了解swift标准库中关于数组类型的详细讨论,请看“数组“
164
+ 想要更多了解swift标准库中关于数组类型的详细讨论,请看 “数组“。
165
165
166
166
> 数组类型的语法
167
167
@@ -198,7 +198,7 @@ Optional 是一个含有两种情况的枚举,None和Some(T),用来表示可
198
198
你可以用可选链接和可选绑定选择性执行可选表达式上的操作。如果值为nil,任何操作都不会执行,也不会有运行报错。
199
199
200
200
201
- 更过关于可选类型的信息和例子,请看“可选“。
201
+ 更过关于可选类型的信息和例子,请看 “可选“。
202
202
203
203
204
204
> 可选类型语法
@@ -246,7 +246,7 @@ Optional 是一个含有两种情况的枚举,None和Some(T),用来表示可
246
246
247
247
protocol<Protocol 1, Protocol 2>
248
248
249
- 一个协议组合类型的类型符合多个协议的要求,不需定义新的命名协议,它继承了从每个协议符合的类型。例如,指定一个协议组合类型protocol相当于定义一个新的协议ProtocolD,它继承了ProtocolA, ProtocolB和 ProtocolC,但是没有引入一个新的名字。
249
+ 一个协议组合类型的类型符合多个协议的要求,不需定义新的命名协议,它继承了从每个协议符合的类型。例如,指定一个协议组合类型protocol相当于定义一个新的协议ProtocolD,它继承了ProtocolA, ProtocolB和 ProtocolC,但是没有引入一个新的名字。
250
250
251
251
协议组合列表中的每一项必须是协议名或者是协议组合类型的别名。如果列表是空的,它会指定一个空的协议组合类型,任何类型都可以匹配。
252
252
@@ -299,7 +299,7 @@ Optional 是一个含有两种情况的枚举,None和Some(T),用来表示可
299
299
## 类型继承子句
300
300
301
301
302
- 类型继承子句被用来指定一个命名类型继承哪个类,适配哪些协议。类型继承子句以冒号(:) 开始,紧跟着以逗号分割的类型标示符列表。
302
+ 类型继承子句被用来指定一个命名类型继承哪个类,适配哪些协议。类型继承子句以冒号(:) 开始,紧跟着以逗号分割的类型标示符列表。
303
303
304
304
305
305
类类型可能继承单个超类,适配多个协议。当定义一个类的时候,超类的名称必须出现在类型标示符列表首位,接着是类必须适配的一些协议。如果类不继承其他类,那么列表就是以协议开头。类机继承的扩展讨论和例子,请看 “继承”。
@@ -322,7 +322,7 @@ Optional 是一个含有两种情况的枚举,None和Some(T),用来表示可
322
322
## 类型推断
323
323
324
324
325
- swift广泛使用类型推断,它允许你在代码里忽略很多变量和表达式的类型或者部分类型。例如,var x: Int = 0可以完全忽略类型,简写成 var x = 0 -- 编译器能够正确的推测出x的类型名称是Int。同样,当完整的类型能够通过上下文推断出来的时候,你可以忽略部分类型。例如, dict: Dictionary = [ "A": 1] , 编译器推断出dict的类型是Dictionary。
325
+ swift广泛使用类型推断,它允许你在代码里忽略很多变量和表达式的类型或者部分类型。例如,var x: Int = 0可以完全忽略类型,简写成 var x = 0 -- 编译器能够正确的推测出x的类型名称是Int。同样,当完整的类型能够通过上下文推断出来的时候,你可以忽略部分类型。例如, dict: Dictionary = [ "A": 1] , 编译器推断出dict的类型是Dictionary。
326
326
327
327
328
328
在上面的两个例子中,类型信息从表达树的叶子传向根。也就是说,x在var x: Int = 0的类型通过首先判断0的类型,然后再传递类型信息到根(即变量x)。
0 commit comments