常量和变量将一个标识符和一个特定类型的值关联起来,使得可以通过这个标识符来访问这个值。let
声明一个常量,初始化之后就不可修改,var
声明一个变量,它的值是可以修改的。
let pi = 3.14;
var n = 42;
在标识符后面加:
可以添加类型注解,明确它可以储存的值的类型。如果省略了类型注解,编译器会根据值自行推断合适的类型。
let greeting: String = "Hello, World!";
标识符几乎可以使用任何字符,甚至包括 Unicode 字符,但不可以出现任何空白字符、数学符号、箭头、保留(或无效的)Unicode 码位、连线和制表符,也不能以数字开头。
使用print(_:sep:term:)
函数打印常量或变量中的值。sep
表示分隔符,默认为""
,term
为结束符,默认为\n
,如果不希望输出完换行,可以传入""
。要将变量或常量的值插入到字符串中,可以用\()
。
let name: String = "John";
print("Hello, my name is \(name).");
单行注释以//
开头,到行尾结束;多行注释以/*
开头,到下一个*/
结束,可以换行。
整数包括有符号(正、零或负数)和无符号(零或正数)的,根据占用的比特位分为 8、16、32、64 位。例如 8 位无符号整数是UInt8
,32 位有符号整数是Int32
。通过min
和max
属性来获取该数据类型可以取到的最小和最大值。
let minValue = UInt8.min; // 0
let maxValue = UInt8.max; // 255
Int
和UInt
在 64 位操作系统中等价于Int64
和UInt64
。
字面量支持二进制(0b
前缀)、八进制(0o
前缀)、十进制和十六进制(0x
前缀)。
浮点数包括Float
(32 位)和Double
(64 位)两种,默认情况下编译器会将浮点数推断为Double
类型。
字面量支持十进制、十六进制(0x
前缀),十进制既可以是小数形式也可以是指数形式(e
或E
,基数为 10),十六进制只能是指数形式(p
或P
,基数为 2)。
使用类型名()
可以使用现有的变量创建一个新变量以参与运算,如:
let twoThousand: UInt16 = 2_000;
let one: UInt8 = 1;
let twoThousandAndOne = twoThousand + UInt16(one); // UInt16, 2001
整数和浮点数之间的转换必须是显式的:
let a = 3;
let b = 0.14159;
let pi = Double(a) + b; // 3.14
let c = Int(pi); // 3
结合数值常量/变量的规则和结合数值字面量的规则不同,因为数值字面量是没有明确类型的,只在编译器需要计算时才会被推测出来,因此字面量3
和0.14159
可以直接相加,但是两个常量/变量不可以。
typealias
为变量设置一个别名,可以结合上下文语境给类型一个更具可读性的名字。
typealias AudioSample = UInt64;
布尔值Bool
只能取两个常量值true
(真)和false
(假)。更详细的信息参见[[05.控制流|控制流]]。
元组将多个值组合在一起,这些值可以是任何类型,并且不必相同。元组可以被拆开赋值给多个变量,如果希望丢弃某一个值可以用_
代替。
let httpResp = (404, "Not Found");
let (code, detail) = httpResp;
print("The status code is \(code)"); // 404
print("The status message is \(detail)"); // Not Found
用NAME.INDEX
根据索引获取元组的值:
print("The status code is \(httpResp.0)"); // 404
print("The status message is \(httpResp.1)"); // Not Found
定义元组时可以给元素命名,这样就可以通过名称来访问:
let httpResp = (code: 404, detail: "Not Found");
print("The status code is \(httpResp.code)"); // 404
print("The status message is \(httpResp.detail)"); // Not Found
在类型注解后面加上?
表示这个常量/变量可能没有值,也可以给变量赋一个nil
将其设置为没有值。可以通过和nil
比较来判断是否储存了值。
var a: Int? = 404;
var b = nil;
if a != nil {
print("Value of a is \(a!)");
} else {
print("a is nil");
}
可选项绑定可以判断是否包含值,如果包含就将值赋给一个临时的常量/变量。
if let val = a {
print("Value of a is \(val)");
} else {
print("a is nil");
}
临时变量/常量可以和原变量/常量同名,因此可以简写为:
if let a {
print("Value of a is \(a)");
} else {
print("a is nil");
}
如果在声明常量/变量时在类型注解后面添加!
,就可以像非可选值一样使用而无须展开,被称为隐式展开可选类型。
声明函数时,在函数名后面加throw
关键字表示这个函数在遇到错误情况时会抛出一个错误。
func Foo throws {
// this function may throw an error.
}
函数的访问者可以捕获这个错误并作出合适的反应。
do {
try Foo();
} catch Error.Error1 {
Deal1();
} catch Error.Error2(let msg) {
Deal2(msg);
}
断言会在程序运行时检查一个逻辑条件是否为true
,如果是则程序继续运行,如果不是程序就会立刻终止。
let age = -3;
assert(age >= 0, "A person's age can't less than 0.");
先决条件会在程序运行时检查一个逻辑条件是否为true
,如果是则程序继续运行,如果不是程序就会立刻终止。
precondition(index > 0, "Index must be greater than 0.");