Lecture 1

struct & View

struct ContentView: View 不是继承自 View 也不是一个 View 的子类,只是表现得像一个 View ,会有和 View 一样的行为,或者像 View 一样运作,这是函数式编程和面向对象的编程的区别。

var body: some Viewsome Viewbody 的类型,表示 body 只要表现得像一个 View 即可,是怎样的 View 都可以。也就是说,在这个属性的返回中,可以返回任意个 View 的组合,无需重新对其进行类型定义,也无需通过创建 View 并添加到父 View 的方式来构造。

Lecture 2

MVVM

MVVM:Model-View-ViewModel,是一种代码组织的架构设计模式,与响应式交互的概念一同使用,SwiftUI 必备,与 MVC 不同。

Model

模型 Model 是与 UI 无关的,它存储数据和逻辑。

View

视图是对模型 Model 的表达,数据只能从模型 Model 流向视图 View,且是只读的。

视图 View 是无状态的,声明式的,我们不需要调用函数修改视图的展示,在视图 View 中唯一需要调用的函数是修饰符,视图 View 会跟随模型 Model 当下的状态去反映。

命令式在绘制视图 View 时的表现并不好,因为会耗费时间,发出每一个命令的时候都需要等待其他的命令完成。

视图 View 也是响应式的,只要模型 Model 发生改变,视图 View 就跟着改变。

ViewModel

ViewModel 的工作是将视图 View 绑定在模型 Model 上。

视图 View 内的代码要相当简单,而其他例如数据的类型转换等工作都要由 ViewModel 来实现。

ViewModel 会意识到模型 Model 的改变,如果模型 Model 是一个结构体 struct,那么 Swift 是可以感知到它的变化的。

ViewModel 不会直接与视图 View 对话,也不会持有对视图 View 的指针引用,它只是广播发布 publish 哪些东西发生了改变,视图 View 订阅了这些广播。

ViewModel 还会传递意图,将要对模型 Model 进行的改变传递出来,例如对视图 View 进行手势操作后,会调用意图函数改变模型 Model

ViewModel 知道模型 Model 的一切。

截屏2021-12-15 下午9.12.36.png

struct & class

函数参数可以有两个标签,一个作为外部调用时使用,另一个作为内部描述使用。

截屏2021-12-16 下午7.34.01.png

结构体的拷贝只会在发生改变的时候才真实发生拷贝,其他时间都是使用同一份拷贝的。

ViewModel 一定是一个类。因为类存储在堆上,所以容易用来分享,View 可以使用指针引用 ViewModel

结构体是函数式编程,类是面向对象的编程。

结构体的可变性要明确指明,类总是可变的。

结构体
值类型 引用类型
传递赋值拷贝 传递指针
只在内容真的发生改变时才拷贝 自动引用计数
函数式编程 面向对象编程
无继承 单一继承
默认构造器会初始化所有成员变量 默认构造器不会初始化任何成员变量

截屏2021-12-22 下午4.22.59.png

Generics

Swift 是强类型语言,所有的值都需要类型,但如果不 care 类型时可以使用泛型。