使用的是cocoachina. 整理精较的《the swift programming language中文完整版》pdf版,P*表示多少页。
类是对象的模板或蓝图,类是对象的抽象化,对象是类的实例化。类不代表具体的事物,而对象表示具体的事物。
P33
注意:Double精确度很高,至少有15位数字,而Float最少只有6位数字。选择哪个类
型取决于你的代码需要处理的值的范围。
P43
注意:nil不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失
的情况,请把它们声明成对应的可选类型。
P44
注意:Swift 的nil和 Objective-C 中的nil并不一样。在 Objective-C 中,nil是一个指向
不存在对象的指针。在 Swift 中,nil不是指针——它是一个确定的值,用来表示值缺失。
任何类型的可选都可以被设置为nil,不只是对象类型。
P50
-9 = (4 × -2) + -1
在对负数 -b 求余时, -b的符号会被忽略. 这意味着 a % b 和 a % -b的结果是相同的.
P84
这个循环执行流程如下:
for initialization; condition; increment {
statements
}
1、循环首次启动时,初始化表达式(initialization expression)被调用一次,用来初始化循
环所需的所有常量和变量。
2、条件表达式(condition expression)被调用,如果表达式调用结果为 false,循环结束,
继续执行 for 循环关闭大括号(})之后的代码。如果表达式调用结果为 true,则会执行大括
号内部的代码(statements)。
3、执行所有语句(statements)之后,执行递增表达式(increment expression)。通常会
增加或减少计数器的值,或者根据语句(statements)输出来修改某一个初始化的变量。当
递增表达式运行完成后,重复执行第2步,条件表达式会再次执行。
P102
NOTE:fallthrough 关键字不会检查它下一个将会落入执行的case 中的匹配条件。
fallthrough 简单地使代码执行继续连接到下一个case中的执行代码,这和C语言标准中的
switch语句特性是一样的。
闭包网上总结:
1,闭包外层是个函数.
2,闭包内部都有函数.
3,闭包会return内部函数.
4,闭包返回的函数内部不能有return.(因为这样就真的结束了)
5,执行闭包后,闭包内部变量会存在,而闭包内部函数的内部变量不会存在.
P127
字典 digitNames 下标后跟着一个叹号 (!),因为字典下标返回一个可选值 (optional
value),表明即使该 key 不存在也不会查找失败。
P128
func makeIncrementor(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementor() -> Int {
runningTotal += amount
return runningTotal
}
return incrementor
}
makeIncrementor 返回类型为 () -> Int。 这意味着其返回的是一个函数,而不是一个简单 类型值。 该函数在每次调用时不接受参数只返回一个 Int 类型的值。
P132
每个枚举定义了一个全新的类型。像 Swift 中其他类型一样,它们的名字(例如
CompassPoint 和 Planet)必须以一个大写字母开头。
P133
正如在控制流中介绍,当考虑一个枚举的成员们时,一个 switch 语句必须全面。
P136
如果一个枚举成员的所有关联值被提取为常量,或者它们全部被提取为变量,为了简洁,你
可以只放置一个 var 或者 let 标注在成员名称前。
P139
注意:通常一个类的实例被称为对象。然而在 Swift 中,类和结构体的关系要比在其他语
言中更加的密切,本章中所讨论的大部分功能都可以用在类和结构体上。因此,我们会主
要使用实例而不是对象。
P142
结构体和枚举是值类型,类是引用类型
P146
"等价于"表示两个类类型(class type)的常量或者变量引用同一个类实例。
"等于"表示两个实例的值“相等”或“相同”,判定时要遵照类设计者定义定义的评判标准,因
此相比于“相等”,这是一种更加合适的叫法。
当你在定义你的自定义类和结构体的时候,你有义务来决定判定两个实例“相等”的标准。
在章节运算符函数(Operator Functions)中将会详细介绍实现自定义“等于”和“不等于”运算
符的流程。
P147
按照通用的准则,当符合一条或多条以下条件时,请考虑构建
结构体:
结构体的主要目的是用来封装少量相关简单数据值。
有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用。
任何在结构体中储存的值类型属性,也将会被拷贝,而不是被引用。
结构体不需要去继承另一个已存在类型的属性或者行为。
合适的结构体候选者包括:
几何形状的大小,封装一个width属性和height属性,两者均为Double类型。
一定范围内的路径,封装一个start属性和length 属性,两者均为Int 类型。
三维坐标系内一点,封装x,y和z属性,三者均为Double类型。
在所有其它案例中,定义一个类,生成一个它的实例,并通过引用来管理和传递。实际
中,这意味着绝大部分的自定义数据构造都应该是类,而非结构体。
P151
我们通过使用恒等运算符(identity operators)( === and !==)来判定两个数组或子数组共用
相同的储存空间或元素。
P152
计算属性可以用于类、结构体和枚举里,存储属性只
能用于类和结构体。
存储属性和计算属性通常用于特定类型的实例,但是,属性也可以直接用于类型本身,这种
属性称为类型属性。
P161
实例的属性属于一个特定类型实例,每次类型实例化后都拥有自己的一套属性值,实例之间
的属性相互独立。
也可以为类型本身定义属性,不管类型有多少个实例,这些属性都只有唯一一份。这种属性
就是类型属性。
对于值类型(指结构体和枚举)可以定义存储型和计算型类型属性,对于类(class)则只能
定义计算型类型属性。
因为值类型是值属性,类是引用属性。
值类型的存储型类型属性可以是变量或常量,计算型类型属性跟实例的计算属性一样定义成
变量属性。
P162
使用关键字static来定义值类型的类型属性,关键字class来为类(class)定义类型属性。
P166
结构体和枚举能够定义方法是 Swift 与 C/Objective-C 的主要区别之一。在 Objective-C
中,类是唯一能定义方法的类型。但在 Swift 中,你不仅能选择是否要定义一个类/结构体
/枚举,还能灵活的在你创建的类型(类/结构体/枚举)上定义方法。
P170
结构体和枚举是值类型。一般情况下,值类型的属性不能在它的实例方法中被修改。
但是,如果你确实需要在某个具体的方法中修改结构体或者枚举的属性,你可以选择变异
(mutating)这个方法,然后方法就可以从方法内部改变它的属性;并且它做的任何改变在方
法结束时还会保留在原始结构中。方法还可以给它隐含的 self 属性赋值一个全新的实例,这
个新实例在方法结束后将替换原来的实例。
P172
实例方法是被类的某个实例调用的方法。你也可以定义类型本身调用的方法,这种方法就
叫做类型方法。声明类的类型方法,在方法的 func 关键字之前加上关键字 class;声明结构
体和枚举的类型方法,在方法的 func 关键字之前加上关键字 static。
P175
附属脚本允许你通过在实例后面的方括号中传入一个或者多个的索引值来对实例进行访问
和赋值。语法类似于实例方法和计算型属性的混合。与定义实例方法类似,定义附属脚本使
用 subscript 关键字,显式声明入参(一个或多个)和返回类型。与实例方法不同的是附属
脚本可以设定为读写或只读。
P193
只要在构造过程结束前常量的值能确定,你可以在构造过程中的任意时间点修改常量属性
的值。
注意:对某个类实例来说,它的常量属性只能在定义它的类的构造过程中修改;不能在子
类中修改。
P199
构造器之间的代理调用
规则 1
指定构造器必须调用其直接父类的的指定构造器。
规则 2
便利构造器必须调用同一类中定义的其它构造器。
规则 3
便利构造器必须最终以调用一个指定构造器结束。
指定构造器必须总是向上代理 ,
便利构造器必须总是横向代理
P202
注意:与方法、属性和下标不同,在重载构造器时你没有必要使用关键字override。