Ekulelu's Blog

学Swift4之2——基本类型和基本运算

基本类型
其实和C差不多,也就是那几个。多出来的是Tuple和可选类型这两个概念

数字类型
这里记录一下每个类型的大小。
Int 在32位机器上是Int32 ,在64位机器上是Int64. 除了Int之外,还有Int,Int8,Int16,Int32,Int64.
UInt在32位机器上是UInt32 ,在64位机器上是UInt64. 除了UInt之外,还有UInt8,UInt16,UInt32,UInt64.
Double 64位浮点数
Float 32位浮点数

Swift不支持数字类型之间的自动转换。必须显式手动转换。

1
2
3
var i: Int = 2_000 //这个表示2000
var d: Double = 5.3
var e = d * Double(i)

不同进制的前缀
十进制 没有
二进制 0b
八进制 0o
十六进制 0x
科学计数
1.25e2 代表 1.25乘上10的2次方
0xFp2 代表 15乘上2的2次方
typealias 关键字,用来个类型起别名

1
2
typealias ii = Int8
var mm = ii.min //这里的ii代表了Int8

Boolean 类型
Swift和java一样,对boolean类型是强要求的,不能在if里面传一个整形用于判断。

新类型——元组(Tuple)
其实就是一群数据组合,可以将其解出来输出。注意的是tuple不只是两个元素,你可以自己扩展成多个元素。

1
2
3
4
5
6
var menu = ("apple", 20) //定义一个Tuple
var menu2 = (name: "banana", price:10) //可以在定义的时候指定元素名字
let (name,price) = menu //解Tuple,如果某个元素不想要的话,用 _ 代替
print(name, price) //输出 apple 20
print(menu.0,menu.1) //不解Tuple直接输出
print(menu2.name,menu2.price) //利用元素名字解Tuple

可选类型(Optionals)
当一个方法可以返回一个对象的时候,它有可能返回一个空值。比如将字符串转换为数字的方法。为了处理这种情况,有了可选类型。
可选类型表示一个数据,它可能有值,也可能为空。基本语法是在类型的后面加上问号 ?
比如下面的代码

1
2
var str:String
print(str) //这里报错说str没初始化

但是如果将str改为可选类型,那么这就可以输出了

1
2
var str:String?
print(str) //输出 nil

那怎么将一个可选类型转换为对应的类型呢?这里有个强制解包的概念,使用 ! 对可选类型解包。请看下面代码。 强制解包有个注意点,就是如果这个可选类型是nil的话,那么强制解包的语句会在运行时报错。

1
2
3
var str:String? = "fe"
var s = str! //将str解包为s,但是如果str没有赋值的话,那么这句会在运行时报错
print(s)

为了解决强制解包的时候,可选类型可能为nil的问题。if语句里面多了一个 Optional Binding 的概念。就是将可选类型解包后判断是否为nil,然后执行不同的分支代码

1
2
3
4
5
6
7
//因为没给str赋值,所以输出 str为空
var str:String?
if let s = str {
print("str有值")
} else {
print("str为空")
}

如果在编程中,我们可以确保可选类型一定不为nil的,那么每次要将可选类型解包都要加个 !,很麻烦。所以有了隐式可选类型,它是用 ! 代替了 ? 号。然后在需要将可选类型转换为对应类型的时候就不用加 ! 了

1
2
var str:String! = "string"
var s = str

基本运算
一些和C完全一样的基本运算如下
加减乘除,负号,自增(++)自减(–),+=等, 判断大小之类(==,!=,>=…),三元运算符,逻辑运算(!,&&,||)

不一样的运算符
取模%,在C中,只能对整形进行运算,Swift中可以对浮点数进行运算。结果就是多出来的那部分
比如 7.1%2.5 得到2.1,因为7.1可以最多减去2个2.5,然后剩下2.1

范围运算符 … 和 ..< 这两个运算符可以用在for里面。比如

1
2
3
4
5
6
7
8
//输出 1 2 3 包含最后一个元素3
for i in 1...3 {
print(i)
}
//输出 1 2 不包含最后一个元素3
for i in 1..<3 {
print(i)
}

单范围运算符
对于下标运算可以这样用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names[2...] {
print(name)
}
// Brian
// Jack
for name in names[...2] {
print(name)
}
// Anna
// Alex
// Brian
for name in names[..<2] {
print(name)
}
// Anna
// Alex

??
这是一个二元运算符,例子 a ?? b
它的意思是:如果可选类型a不是nil,那么解包a并返回解包值,如果a为nil,那么返回b
相当于 a != nil ? a! : b