atSwift 2016 笔记(一)Programming with Structs


2016 atSwift - Programming with Structs by Chris Eidhof

  • Info:
    • Swift 3.0
    • Xcode 8.2.1
    • macOS 10.12.4 beta (16E175b)

前言

atSwift 2016 是 2016 年国内举行的一场 Swift 开发者大会。虽然已经过去一年多,但其中还是有很多值得学习的地方。所以这次的笔记就针对其对外公开的视频及资料,学习一下前沿开发者的思路思维。当然,由于当时 Swift 的大版本为 2,因此本文会针对其中的代码进行更新为 3.0。

由于 Chris 的演讲没有 Keynote,而是现场 Live Code。且主要围绕 Struts 解读,所以其中涉及到其他方面的知识并不深入。

Protocol & Extension

  • 当对一个类过于依赖时,可以使用协议和扩展减小这种依赖。
  • 例如,在 Chris Demo 的最初状态中,代码中充斥着 UserDefaults,而我们只需要其中的两个方法。即可使用以下协议和扩展的组合来减小这种依赖。
1
2
3
4
5
6
7
protocol Storage {
func object(forKey defaultName: String) -> Any?
func set(_ value: Any?, forKey defaultName: String)
}
// 因为 UserDefaults 拥有这两个方法的具体实现,所以我们自己就不需要去实现。
extension UserDefaults: Storage {}

Structs

  • 虽然,struct 是值类型,但 Swift 中的 struct 的效率由于其底层优化(仅在需要时复制,仅更改需要修改的属性),和 class 的性能几乎一样。
  • 结构体更加安全,是 Swift 更加推荐的类型,但必要时也需要使用类。
  • 结构体通常在栈(Stack)中,类通常在堆(Heap)中,这也是值类型与引用类型的区别,可以参考 Swift 中的值类型与引用类型
  • 修改嵌套结构体内的结构体,意味着修改整个结构体,可使用 didSet 观察。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct Name {
var firstName: String
var lastName: String
}
struct Person {
var name: Name
var age: Int
}
var kingcosName = Name(firstName: "King", lastName: "Cos") {
didSet {
print("Name Changed!")
}
}
var kingcos = Person(name: kingcosName, age: 22) {
didSet {
print("Person Changed!")
}
}
kingcos.name.lastName = "Cosmos"
// Person Changed!

didSet

  • 利用属性观察器,可以方便的在其中加入必要的方法。当数据改动则直接调用该方法。
1
2
3
4
5
6
var player: Player {
didSet {
// 赋值后自动保存
save()
}
}

参考

才疏学浅,如有错误或不当之处,请您一定指出! 如果能帮到您,那就再好不过了~