「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战」。
在经常有人跟我说会oc去写swift很简单,但是在我不断的学习过程中发现实际情况并不是那样,如果真的那样去写只是写了“OC”式的swift,而不是应用到了真正的swift技巧。我个人认为应该有这些技巧,而且技巧会在不停的更新换代中,下面记录下自己的实际使用的一些技巧:
在单个文件中管理一些全局的常量:
在我们要管理项目的时候需要创建一些全局通用的常量,这个时候应该创建一个文件并仅在此处管理所有常量。
enum AppConstants {
static let AppName = "AppName"
static let AppVersion = "1.0.0"
...
}
复制代码
多层使用guard let,而不是if let嵌套下去
用if的例子,可以看到不停的在嵌套下去,如果if层级少了还好,如果多了过段时间下面条理会乱,会又重头来梳理一遍。
let a:String? = ""
let b:String? = ""
if let tempa = a {
if let tempb = b {
print(tempa,tempb)
}
}
复制代码
而使用guard let
会是字面清晰,多个也只是不断的guard let 下去。。条理永远清晰。
let a:String? = ""
let b:String? = ""
guard let tempa = a else { return }
guard let tempb = b else { return }
...
print(tempa,tempb)
复制代码
巧用where关键词
一般以前我们的写法是:
if let path = webUrl {
if path.hasPrefix("https") {
//...
}
}
复制代码
而使用where
关键词
if let path = webUrl, path.hasPrefix("https") {
// 做好事
}
复制代码
where
更有用可用于检查关联类型是否必须确认落在 where 关键字之后的某个协议,在后面的关键词系列会详情介绍where
。这里的,
就是where
。
weak 自定义委托:
这样可以防止循环引用。
protocol P1 : AnyObject {}
class Class1 {
weak var delegate : P1?
}
复制代码
多用扩展进行细分
很明显的利用扩展进行细分就是UITableView。
extension UITableView: UITableViewDataSource{
...
}
extension UITableView: UITableViewDelegate {
....
}
复制代码
巧用泛型
很好合理的去使用泛型让我们不少重复的代码。泛型允许您声明一个变量,该变量在执行时可以分配给我们定义的一组类型。
func printObjc<T> (_ obj: T, message: String = "") {
print("\(message)\(obj)")
}
复制代码
省略使用KVO
KVO(Key Value Observer),当该键的值发生变化时,您可以在其中设置和观察任何键和动作。这是 swift 的好方法,但不是更好的方法。在 swift 中有一个 KVO 的替代品,即property observer. 我们使用它可以在属性的值将要更改时获取操作。willSet
在存储值之前调用,didSet
在存储新值后立即调用。
class Class1 {
var num: Int = 0 {
willSet(newValue) {
print("newValue = \(newValue), oldValue = \(num)")
}
didSet {
print("oldValue = \(oldValue), currentValue = \( num)")
}
}
}
复制代码
合理使用defer
defer是一个块,意思是一些想稍后执行的指令。它可以包含一行代码或一堆代码行。我们可以在函数中定义一个 defer 块,它会在函数执行结束时被调用。同时也减少了代码冗余。
func checkdefer() {
defer {
print("1")
}
print("2")
}
复制代码
使用defer
能让您保证在函数执行完成之前必须会进行的一些操作(如资源释放。内存释放)。
合理使用嵌套函数
您可以使用其他函数的体定义一个函数,称为嵌套函数。嵌套函数将对外界隐藏,但可以被其封闭函数调用和使用。封闭函数还可以返回其嵌套函数,以便可以在外部世界或其他范围内使用,我认为合理的它将提高代码的可读性和可重用性,但是无限的套娃下去也是头疼。
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
func stepForward(input: Int) -> Int { return input + 1 }
func stepBackward(input: Int) -> Int { return input - 1 }
return backwards ? stepBackward : stepForward
}
复制代码
多使用 Playground进行一些简单的测试
Playground 是一个非常简单和交互式的 swift 工具。当要测试一些逻辑代码的测试可以在Playground上对其进行验证,同时也可用于在Playground进行学习。 关于 playground 一些基本的介绍可以查看官方的帮助文档。