Swift Language Guide5.2 第一篇:基础篇之
Comments 注释
在代码中使用注释来加入一段不执行的文本,作为你自己的一个笔记或者提醒。当 Swift 编译器编译的你的代码的时候,注释将会被忽略掉。
Swift 中的注释和 C 语言中的非常相似。单行的注释以两个斜杆开始//
:
// This is a comment.
多行注释以 /*
开头,以 */
结束
/* This is also a comment
but is written over multiple lines. */
与 C 语言不同的多行注释,Swift 运行多行注释里面嵌套多行注释。
/* This is the start of the first multiline comment.
/* This is the second, nested multiline comment. */
This is the end of the first multiline comment. */
Semicolons 分号
和其他语言不同,Swift 不强制你再每一行代码后面加上 ;
分号,虽然喜欢的话可以加上。尽管如此,如果在一行里面有多句代码,那么分号作为分隔符是必须要加上的。
let cat = "🐱"; print(cat)
// Prints "🐱"
Integers 整型
整型是不带有小数部分的数字,比如 23
和 -23
。整型要么是带符号的(正,零,负)要么是不带符号的(正,零)。
Swift 提供 8 位,16 位,32 位和 64 位的带符号和不带符号的整型。这些整型遵守类似于 C 语言的命名约定,其实 8 位无符号整型是 UInt8
,而 32 位有符号整型是 Int32
,像 Swift 中所有的类型一样,这些整型的类型都有大写的名称。
Integer Bounds 整型的范围
可以通过访问每种整型的max``min
属性来获取最大值和最小值。
let minValue = UInt8.min // minValue is equal to 0, and is of type UInt8
let maxValue = UInt8.max // maxValue is equal to 255, and is of type UInt8
这些属性值是具有适当大小的数字类型(比如上面的 UInt8
),因此可以和表达式中其他同类型的值一起使用。
int
大部分情况下,你不需要在你的代码中指定一个特别的整型。Swift 提供了额外的整数类型,Int
,他的大小和当前原生平台大小相同。
- 在 32 位的平台上,
Int
的大小是 Int32. - 在 64 位的平台上,
Int
的大小是 Int64.
大部分情况在你的代码使用Int
类型就行,除非你需要特别指定它的大小。这有助于保证代码的一致性和互通性。即使在 32 位的平台下,Int
可以存储 -2,147,483,648
到 2,147,483,647
,这是一个足够大的整型范围。
UInt 无符号整型
Swift 也提供了大小和当前操作平台相关联的无符号整型 UInt
:
- 在 32 位的平台上,
Int
的大小是 UInt32. - 在 64 位的平台上,
Int
的大小是 UInt64.
NOTE
UInt
只能适用于非负数整型,在通常情况下我们选择使用Int
型会让代码有更好的容错率。
Floating-Point Numbers 浮点型
浮点型是带有小数部分的数字类型,比如 3.14159
, 0.1
和 -273.15
。
浮点型能展现比整型更宽阔的范围,能储存比Int
更大或者更小的数字。Swift 提供了两种带符号的浮点型:
-
Double
是 64 位浮点型 -
Float
是 32 位浮点型
NOTE
Double
的精度是 15 个十进制的数字,而 Float 的精度可以降低至 6 个十进制数字。要根据你的代码选择合适的浮点型。如果任何一种类型都适合的情况下,首选Double
.
Type Safety and type inference 类型安全和类型推断
Swift 是一个 type-safe
类型安全的语言。一个类型安全的语言鼓励你明确代码中所有类型的值。如果你的代码中需要一个String
,那么你就不能给它传递Int
。
因为 Swift 是类型安全的语言,它会在编译的时候实行代码检查然后把错误的类型匹配标记出来。这可以使得你在软件开发中能尽早捕获和修复错误。
当你使用不同类型的值的时候,类型检查可以帮你避免这种错误。然而,这并不意味着你必须在声明一个变量或常量的时候给它指定类型。如果你不需要给它指定类型,Swift 会使用type inference
类型推断出合适的类型。类型推断机制可以让编译器在编译你代码的时候,根据你的表达式检查你提供的值来推断出特定的类型。
因为有类型推断机制,Swift 比 C 语言和 Objective-C 需要更少的类型声明。常量和变量依然是明确的类型,当时大部分指定类型的工作都为你完成了。
类型推断机制在你用一个值去初始化常量或者变量的时候格外好用。通常在你声明常量或者变量的时候给他赋值就行了。
例如,你把 42
赋值给一个新的常量而不说明它的类型,Swift 会推断你想要这个常量是 Int
类型的,因为你给它初始化的数值看起来一个 Int
:
let meaningOfLife = 42
// meaningOfLife is inferred to be of type Int
同样的,如果未指定类型而给它初始化一个浮点型,Swift 会推断你想要创建一个 Double
类型。
let pi = 3.14159
// pi is inferred to be of type Double
Swift 通常会把浮点型认为是 Double
而不是Float
。
如果在一个表达式中你将整型和浮点型一起使用,Swift 将认为是 Double
类型:
let anotherPi = 3.14159
// anotherPi is also inferred to be of type Double
数字3
没有明确指出类型,而浮点数作为加法的另一个参数,所以推断出 Double
类型更为合适。
Numeric Type Conversion 数值类型转换
一般情况下使用 Int 类型来存储整型变量或者常量,即使你知道它不可能为负数。在日常情况下使用默认的整型类型意味着常量或变量有更好的互通性,可以和 类型推断
出来的整型类型进行相互操作。
仅仅当前手头任务特别需要其他整型类型的时候才会使用其他类型,比如因为外部数据源有特别指定类型,或者为了性能,内存,或者其他必要的优化。在那些情况下使用特定的类型,可以帮忙不会一些意外的值溢出和隐式记录所使用数据的性质。
Integer Conversion 整型转换
每个数值类型能够存放数值访问是不同的。一个 Int8
的常量或变量能够存放 -128 到 127 的范围,然而一个 UInt 类型的常量或变量存放的是 0 到 255 的范围。当代码编译的时候如果一个数值常量或变量的值不在限定范围就会报错。
let cannotBeNegative: UInt8 = -1
// UInt8 cannot store negative numbers, and so this will report an error
let tooBig: Int8 = Int8.max + 1
// Int8 cannot store a number larger than its maximum value.
// and so this will also report an error
因为每种数值类型的存储访问不同,所以你必须依据情况适当的加入类型转换。这种方式将避免你代码中的隐式转换错误和明确类型转换的意图。
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
因为现在加法两边的数值都是 UInt16
,所以加法是被允许的,输出常量 twoThousandAndOne
被推算出是 UInt16
,因为是两个 UInt16
的之和。
SomeType(ofInitialValue)
调用 Swift 初始化并传递参数的默认方式。后台,通过初始化函数利用 UInt8
的参数创建了一个 UInt16
类型,这里你不能随意不传递任意类型。这将会在 Extensions 章节介绍。
Integer and Floating-Point Conversion 整型和浮点型的转换
浮点型和整型的转换必须是显式转换:
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi equals 3.14159, and is inferred to be of type Double
这里,Three
用于创建一个新的Double
类型常量,所以加法两边的值类型相同。没有这个转换步骤,这个加法将会报错。
浮点型转整型也需要显式转换,一个整型可以通过Double
或者Float
类型来创建。
let integerPi = Int(pi)
// integerPi equals 3, and is inferred to be of type Int
当整型初始化方法传入的是浮点型数据时,浮点数据会被才有去尾法。这就意味着 4.75
变成4
,而-3.9
变成 -3
。
NOTE
这种合并常量或变量的规则不同于字面量数值。字面量数值3
是可以和0.1315
相加的,因为字面量数值并没有明确指出它的类型。他们的类型只有在编译器编译的时候才会被评估。
Type Aliases 类型别名
Type aliases
为现存的类别定义另一个名字。使用 typealias
关键字来定义类型别名。
当你想为一个现存的类型定义得更加贴合上下文,类型别名是非常有用的。比如使用外部来源的特点大小的数据时:
typealias AudioSample = UInt16
一旦你定义了类型别名,您可以在任何可能使用原始名称的地方使用别名:
var maxAmplitudeFound = AudioSample.min
在此,AudioSample 是一个为UInt16
定义的别名。因为它是别名,所以调用AudioSample.min
的方法实际上是调用 UInt16.min
,所以这个提供的初始值是 0。
Booleans 布尔型
Swift 拥有基础的布尔型,叫做 Bool
,布尔值是用在逻辑相关的,因为它的值只能是 true 或 false。Swift 提供两个布尔常量值 true
和false
。
let orangeAreOrange = true
let turnipsAreDelicious = false
orangeAreOrange
和 turnipsAreDelicious
从他们初始化使用的字面量来看被推断成 Bool
类型。就像上面的 Int
和Double
一样,如果你在初始化的时候给他们赋值就不需要指定他们的类型了。类型推断让 Swift 的代码更加简洁和易阅读。
布尔值在条件判断语句中特别有用,比如if
语句中:
if turnipsAreDelicious {
print("Mmm, tasty turnips!")
} else {
print("Eww, turnips are horrible.")
}
// Prints "Eww, turnips are horrible."
Swift 是类型安全的语言,所以不允许使用非布尔值来代替布尔值使用。比如下面的代码将会报错:
let i = 1
if i {
// this example will not compile, and will report an error
}
然而,另一个例子就是合法的:
let i = 1
if i == 1 {
// this example will compile successfully
}
i == 1
的结果是布尔值的,所以第一个例子通过了类型检查。
和Swift 中其他类型安全的示例一样,这是为避免意外错误的,并确保代码的意图始终清晰。