Swift Tips 翻译和笔记

翻译和笔记相关Swift Tips

文中以 Swift 5 为准

文档地址:
SwiftTips
AwesomeSwift

Swift Tips#

Swift 中使用 weakSelf 和 strongSelf#

1
2
3
4
5
// Block 内容
function(){ [weak self] (data) in
guard let self = self else { return }
print(data)
}

! 很危险,少用#

使用 if let guard let 等方式,避免 !。

struct 很强大#

struct 是值类型,class 是引用类型。类类型分配在堆区,默认浅拷贝,容易被不经意间被改变,而值类型分配在栈区,默认深拷贝。所以优先使用struct

enum 来做 命名空间#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
enum Define {
enum Name {
static let Token = "token"
}

enum URL {
static let RequestURL = "https://www.baidu.com"
}

static let UserData = "UserData"
}

// Define.Name.Token
// Define.UserData

优先guard#

1
2
3
guard let newValue = Test() else {
return
}

面向协议编程#

Swift 中对于 Protocol 的功能进行了极大的加强。一定程度上能替代 抽象类 的左右。所以推荐使用 Protocol 来代替抽象类。

1
2
3
4
5
// 协议定义抽象方法和属性,用来代替面向对象的抽象类
protocol SomeProtocol {
var num: Int { get set }
func test()
}
1
2
3
4
// item 的类型是 协议SomeProtocol,这样所有实现了SomeProtocol协议 的类的实例都可以赋值 item
class Test {
var item: SomeProtocol
}

对了,Swift中,Protocol也是可以扩展的,而且扩展中实现了协议方法,那么这个方法就会称为这个协议的默认实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
protocol SomeProtocol {
func method()
}

extension SomeProtocol {
func method() {
print("Test")
}
}

struct MyStruct: SomeProtocol {}
MyStruct().method()
// 输出:
// Test

善用extension#

extension 虽然在功能上类似 分类,但是却更加的灵活。除了分类的作用外,还可以对类进行方法分化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Test {
init()
}

extension Test {
// 实现私有方法
private func someFunc() {}
}

extension Test {
// 实现对外接口
private func someFunc() {}
}

extension Test: SomeProtocol {
// 实现相关协议方法
}

Swift 中的 KVO 闭包API#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 创建 NSKeyValueObservation 变量,这个变量必须有
var observation: NSKeyValueObservation?

fun observationFunc() {
// 按照方法提示添加监听
observation = webView.observe(\WKWebView.estimatedProgress, options: .new) { [weak self] (wkwebview, change) in
// 必须使用weak self,不然很容易出现循环引用
guard let self = self else {
return
}
print("已经加载 \(change.newValue! * 100)%")
self.progressview.progress = Float(wkwebview.estimatedProgress)
}
}
Cocos Creator Tips 如何从 Swift 过度到 TypeScript

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×