作者 Nemocdz,腾讯 iOS 工程师。这篇文章转载至他的博客,可以点击阅读原文来查看他的博客。本文总结了笔者日常使用 Swift 的一些小 Tips。
文章较长,预计阅读时间 15分钟
Safe & Fast
1. 能用 let,尽量不用 var
把代码里的 var 全改成 let,只保留不能编译通过的。
ObjC 的 Foundation 层几乎都是继承 NSObject
实现的,平时都在操作指针,所以要区分 Mutable 和 Imutable 的设计,比如 NSString
和 NSMutableString
。
Swift 使用了 let 和 var 关键字直接用于区分是否可变。可变会更容易出错,所以尽量采用不可变设计,等到需要改变才改为 var 吧。
2. 尽量不用 !
!遇到 nil 时会 crash(包括 as!
进行强制转换)。可以使用 if let
/guard let
/case let
配合 as?
将可选值消化掉。可能返回 nil 的 API,为什么要自己骗自己呢?
当遇到 ObjC 代码暴露给 Swift 使用时,给接口 .h 文件加上 NS_ASSUME_NONNULL_BEGIN
和 NS_ASSUME_NONNULL_END
并检查接口参数是否可以为 nil 吧。
3. 多定义 struct,少定义 class
struct 是值类型,class 是引用类型。类类型分配在堆区,默认浅拷贝,容易被不经意间被改变,而值类型分配在栈区,默认深拷贝。并且 Swift 还有写时复制(copy on write)。
即使是使用 class 时,也仅在必要时(如桥接到 ObjC,使用 Runtime 一些特性)继承自 NSObject
。
4. 能用 Swift 标准库类型,尽量不用对应的 Foundation 类型
多使用 String
、Array
、Dictionary
、Int
、Bool
,少使用 Foundation 里面的 NSString
、NSArray
、NSDictionary
、NSNumber
。Cocoa Foundation 里面的都是类类型,而 Swift 标准库的是值类型,有很多标准库的方便方法。
还有用 print
代替 NSLog
。
5. 优先使用内置高阶函数
forEach
,map
,conpactMap
,flatMap
,zip
,reduce
是好帮手,代替一些使用变量并在循环中处理的例子吧。用上高阶函数,不仅代码更清晰,还能将状态控制在更小的作用域内。
6. 使用 try catch 捕获错误
和 ObjC 基本都在函数的回调中返回 NSError
不一样,Swift 函数可以使用 throw
关键字抛出错误。
func test() throws {
//...
}
do {
try test()
} catch {