swift代码优化
http://swift.gg/2016/05/16/using-swift-extensions/
http://www.jianshu.com/p/5089e8ac950e
heightForRowAtIndexPath在滑动过程会不断调用,将高度计算放在数据解析之后并将高度保存在数据模型中;模型赋值直接获取高度;在heightForRowAtIndexPath中直接返回模型中高度,减少重复计算。
cell选中后如果UITableView是在UITableViewController中时,就会默然取消,而如果是在UIViewController时,则不会,需要在didSelectRowAtIndexPath添加这一句:
tableView.deselectRowAtIndexPath(indexPath, animated: true)
在Swift中,动态调度默认通过一个vtable[1](虚函数表)间接调用。
建议:当你知道声明不需要被重写时使用“final”。
final关键字是一个类、一个方法、或一个属性声明中的一个限制,使得这样的声明不得被重写。这意味着编译器可以呼叫直接的函数调用代替间接调用。
建议:当声明的东西不需要被文件外部被访问到的时候,就用“private”
将private关键词用在一个声明上,会限制对其进行了声明的文件的可见性。这会让编辑器有能力甄别出所有其它潜在的覆盖声明。如此,由于没有了任何这样的声明,使得编译器可以自动地推断出final关键词,并据此去掉对方面的间接调用和属性的访问。
Swift通过在执行普通计算时检查溢出的方法解决了整数溢出的bug。这些检查在已确定没有内存安全问题会发生的高效的代码中,是不合适的。
建议:当你确切的知道不会发生溢出时使用未检查整型计算。
如:使用 &+进行+运算
将只有类实现的协议标记为类协议
Swift可以指定协议只能由类实现。标记协议只能由类实现的一个好处是编译器可以基于这一点对程序进行优化。例如,ARC内存管理系统能够容易的持有(增加该对象的引用计数)如果它知道它正在处理一个类对象。如果编译器不知道这一点,它就必须假设结构体也可以实现协议,那么它就必须准备好持有或者释放不同的数据结构,而这代价将会十分昂贵。
关于字典
let madridPopulation: Int = cities["Madrid"]
这个例子无法通过类型检查。问题是 "Madrid" 键可能并不存在于 cities 字典里 —— 当 不存在时应该返回什么值呢?我们无法保证字典的查询操作总是为每个键返回一个 Int 值。 Swift 的可选类型可以表达这种失败的可能性。编写这个例子的正确方式应该如下所示:
let madridPopulation: Int? = cities["Madrid"]
例子中 madridPopulation 的类型是可选类型 Int?,而非 Int。一个 Int? 类型的值是 Int 或者特
殊的 “缺失” 值 nil。
我们可以检验查询是否成功:
if madridPopulation!=nil{
print("The population of Madrid is \(madridPopulation! * 1000)")
} else {
print("Unknown city: Madrid")
}
如果 madridPopulation 不是 nil,第一个分支就会被执行。我们写 madridPopulation! 是为了 获取可选值中实际的 Int 值。后缀运算符 ! 强制将一个可选类型转换为一个不可选类型。为了 计算 Madrid 的总人口数,我们强制将可选的 madridPopulation 转换为 Int 并与 1000 相乘。
Swift 有一个特殊的可选绑定 (optional binding) 机制,可以让你避免写 ! 后缀。我们可以将 madridPopulation 的定义和上面的检验语句相结合,使它成为一个新语句:
if let madridPopulation = cities["Madrid"] {
print("The population of Madrid is \(madridPopulation * 1000)")
} else {
print("Unknown city: Madrid")
}
如果查询 cities [ "Madrid"] 是成功的,我们便可以在分支中使用 Int 类型的变量 madridPopulation。值得注意的是,我们不再需要显式地使用强制解包 (forced unwrapping) 运算符。
如果可以选择,我们建议使用可选绑定而非强制解包。如果你有一个 nil 值,强制解包可能导 致崩溃;可选绑定鼓励你显式地处理异常情况,从而避免运行时错误。可选类型未经检验进行 的强制解包,或者 Swift 的隐式解包可选值,都是很糟的代码异味,它们预示着可能发生运行
时错误。
Swift 还给 ! 运算符提供了一个更安全的替代,?? 运算符。使用这个运算符时,需要额外提供 一个默认值,当运算符被运用于 nil 时,这个默认值将被作为返回值。
?? 运算符会检验它的可选参数是否为 nil。如果是,返回 defaultValue 参数;否则,返回可选 值中实际的值。