参考资料:Swift 编程语言
参考资料:Swift 语言指南
1、Swift 增加了 Objective-C 中没有的类型,比如元组。元组允许你来创建和传递一组数据。
2、Swift 增加了可选项,用来处理没有值的情况。可选项意味着要么“这里有一个值,它等于 x”,要么“这里根本没有值”。可选项类似于 Objective-C 中的 nil 指针,但是不只是类,可选项也可以用在所有的类型上。可选项比 Objective-C 中的 nil 指针更安全、更易读,它也是 Swift 语言中许多重要功能的核心。
3、可选项充分证明了 Swift 是一门类型安全的语言。Swift 帮助你明确代码可以操作值的类型。如果你的一段代码预期得到一个 String,类型会安全地阻止你不小心传入 Int。在开发过程中,这个限制能帮助你在开发过程中更早地发现并修复错误。
4、声明常量和变量。常量和变量必须在使用前被声明,使用关键字 let来声明常量,使用关键字 var来声明变量。
5、类型标注。你可以在声明一个变量或常量的时候提供类型标注,来明确变量或常量能够储存值的类型。添加类型标注的方法是在变量或常量的名字后边加一个冒号,再跟一个空格,最后加上要使用的类型名称。 let a : Int = 2。
6、命名常量和变量。常量和变量的名字不能包含空白字符、数学符号、箭头、保留的(或者无效的)Unicode 码位、连线和制表符。也不能以数字开头,尽管数字几乎可以使用在名字其他的任何地方。
7、输出常量和变量。使用 print(_:separator:terminator:) 函数来打印当前常量和变量中的值。默认来说,函数通过在行末尾添加换行符来结束输出。要想输出不带换行符的值,那就传一个空的换行符作为结束——比如说, print(someValue, terminator: "")
8、Swift 使用字符串插值 的方式来把常量名或者变量名当做占位符加入到更长的字符串中,然后让 Swift 用常量或变量的当前值替换这些占位符。将常量或变量名放入圆括号中并在括号前使用反斜杠将其转义:print("The current value of friendlyWelcome is (friendlyWelcome)")
9、注释,与oc类似。//单行被注释的代码 /* 多行被注释的代码 */
10、分号。Swift 并不要求你在每一句代码结尾写分号( ; ),当然如果你想写的话也没问题。总之,如果你想在一行里写多句代码,分号还是需要的。
11、整数。Swift 提供了 8,16,32 和 64 位编码的有符号和无符号整数,这些整数类型的命名方式和 C 相似,例如 8 位无符号整数的类型是 UInt8,32 位有符号整数的类型是 Int32。与 Swift 中的其他类型相同,这些整数类型也用开头大写命名法。
12、你可以通过 min 和 max 属性来访问每个整数类型的最小值和最大值:let minValue = UInt8.min;let maxValue = UInt8.max
13、Swift 提供了一个额外的整数类型: Int,它拥有与当前平台的原生字相同的长度。Swift 也提供了一种无符号的整数类型, UInt,它和当前平台的原生字长度相同。
14、浮点数。Double 有至少 15 位数字的精度,而 Float 的精度只有 6 位。推荐使用 Double 类型。
15、类型安全和类型推断。因为 Swift 是类型安全的,它在编译代码的时候会进行类型检查,任何不匹配的类型都会被标记为错误。这会帮助你在开发阶段更早的发现并修复错误。
16、数值型字面量:十进制数,没有前缀;二进制数,前缀是 0b;八进制数,前缀是 0o;十六进制数,前缀是 0x。
17、浮点字面量可以是十进制(没有前缀)或者是十六进制(前缀是 0x)。小数点两边必须有至少一个十进制数字(或者是十六进制的数字)。十进制的浮点字面量还有一个可选的指数,用大写或小写的 e表示;十六进制的浮点字面量必须有指数,用大写或小写的 p来表示。
18、数值类型转换。
SomeType(ofInitialValue) 是调用 Swift 类型初始化器并传入一个初始值的默认方法。在语言的内部, UInt16有一个初始化器,可以接受一个 UInt8类型的值,所以这个初始化器可以用现有的 UInt8来创建一个新的 UInt16。这里需要注意的是并不能传入任意类型的值,只能传入 UInt16内部有对应初始化器的值。不过你可以扩展现有的类型来让它可以接收其他类型的值(包括自定义类型)。
18.png
19、结合数字常量和变量的规则与结合数字字面量的规则不同,字面量 3 可以直接和字面量 0.14159 相加,因为数字字面量本身没有明确的类型。它们的类型只有在编译器需要计算的时候才会被推测出来。
19.png
20、类型别名。类型别名可以为已经存在的类型定义了一个新的可选名字。用 typealias关键字定义类型别名。
21、布尔值。布尔量类型Bool,它的值只能是真true或者假false。
22、元组。元组把多个值合并成单一的复合型的值。元组内的值可以是任何类型,而且可以不必是同一类型。
22.png 22_2.png
23、可选项。可以利用可选项来处理值可能缺失的情况。可选项意味着:(这里有一个值,他等于x) 或者 (这里根本没有值)。
24、在 C 和 Objective-C 中,没有可选项的概念。在 Objective-C 中有一个近似的特性,一个方法可以返回一个对象或者返回 nil。 nil的意思是“缺少一个可用对象”。然而,他只能用在对象上,却不能作用在结构体,基础的 C 类型和枚举值上。对于这些类型,Objective-C 会返回一个特殊的值(例如 NSNotFound)来表示值的缺失。这种方法是建立在假设调用者知道这个特殊的值并记得去检查他。然而,Swift 中的可选项就可以让你知道任何类型的值的缺失,他并不需要一个特殊的值。
25、如果你定义的可选变量没有提供一个默认值,变量会被自动设置成 nil。也可以通过给可选变量赋值一个 nil来将之设置为没有值.nil 不能用于非可选的常量或者变量,如果你的代码中变量或常量需要作用于特定条件下的值缺失,可以给他声明为相应类型的可选项。
26、Swift 中的 nil和Objective-C 中的 nil不同,在 Objective-C 中 nil是一个指向不存在对象的指针。在 Swift中, nil不是指针,他是值缺失的一种特殊类型,任何类型的可选项都可以设置成 nil而不仅仅是对象类型。
26.png 26_2.png 26_3.png 26_4.png 26_5.png
27、错误处理。通过在函数声明过程当中加入 throws关键字来表明这个函数会抛出一个错误。当你调用了一个可以抛出错误的函数时,需要在表达式前预置 try关键字。do 语句创建了一个新的容器范围,可以让错误被传递到到不止一个的 catch分句里。
27.png
28、断言和先决条件。断言和先决条件用来检测运行时发生的事情。你可以使用它们来保证在执行后续代码前某必要条件是满足的。如果布尔条件在断言或先决条件中计算为 true,代码就正常继续执行。如果条件计算为 false,那么程序当前的状态就是非法的;代码执行结束,然后你的 app 终止。不同于在上文错误处理中讨论的,断言和先决条件并不用于可回复或者期望的错误。由于错误断言或先决条件显示非法的程序状态,所以没办法来抓取错误断言。断言和先决条件的不同之处在于他们什么时候做检查:断言只在 debug 构建的时候检查,但先决条件则在 debug 和生产构建中生效。在生产构建中,断言中的条件不会被计算。这就是说你可以在开发的过程当中随便使用断言而无需担心影响生产性能。
29、你可以使用全局函数 assert(::) 函数来写断言。向 assert(::) 函数传入一个结果为 true或者 false的表达式以及一条会在结果为 false的时候显式的信息(信息可省略):
let age = -3
assert(age >= 0, "A person's age cannot be less than zero")
30、如果代码已经检查了条件,你可以使用 assertionFailure(_:file:line:) 函数来标明断言失败,比如:
if age > 10 {
print("You can ride the roller-coaster or the ferris wheel.")
} else if age > 0 {
print("You can ride the ferris wheel.")
} else {
assertionFailure("A person's age can't be less than zero.")
}
31、强制先决条件。在你代码中任何条件可能潜在为假但必须肯定为真才能继续执行的地方使用先决条件。比如说,使用先决条件来检测下标没有越界,或者检测函数是否收到了一个合法的值。你可以通过调用 precondition(::file:line:) 函数来写先决条件。给这个函数传入表达式计算为 true或 false,如果条件的结果是 false信息就会显示出来。比如说:
precondition(index > 0, "Index must be greater than zero.")
32、可以调用 preconditionFailure(_:file:line:) 函数来标明错误发生了——比如说,如果 switch 的默认情况被选中,但所有的合法输入数据应该被其他 switch 的情况处理。
33、注意!如果你在不检查模式编译( -Ounchecked),先决条件不会检查。编译器假定先决条件永远为真,并且它根据你的代码进行优化。总之, fatalError(:file:line:) 函数一定会终止执行,无论你优化设定如何。你可以在草拟和早期开发过程中使用 fatalError(:file:line:) 函数标记那些还没实现的功能,通过使用 fatalError("Unimplemented") 来作为代替。由于致命错误永远不会被优化,不同于断言和先决条件,你可以确定执行遇到这些临时占位永远会停止。
网友评论