struct ContentView: View
不是继承自 View
也不是一个 View
的子类,只是表现得像一个 View
,会有和 View
一样的行为,或者像 View
一样运作,这是函数式编程和面向对象的编程的区别。
var body: some View
中 some View
是 body
的类型,表示 body
只要表现得像一个 View
即可,是怎样的 View
都可以。也就是说,在这个属性的返回中,可以返回任意个 View
的组合,无需重新对其进行类型定义,也无需通过创建 View
并添加到父 View
的方式来构造。
MVVM:Model-View-ViewModel
,是一种代码组织的架构设计模式,与响应式交互的概念一同使用,SwiftUI
必备,与 MVC
不同。
模型 Model
是与 UI
无关的,它存储数据和逻辑。
视图是对模型 Model
的表达,数据只能从模型 Model
流向视图 View
,且是只读的。
视图 View
是无状态的,声明式的,我们不需要调用函数修改视图的展示,在视图 View
中唯一需要调用的函数是修饰符,视图 View
会跟随模型 Model
当下的状态去反映。
命令式在绘制视图 View
时的表现并不好,因为会耗费时间,发出每一个命令的时候都需要等待其他的命令完成。
视图 View
也是响应式的,只要模型 Model
发生改变,视图 View
就跟着改变。
ViewModel
的工作是将视图 View
绑定在模型 Model
上。
视图 View
内的代码要相当简单,而其他例如数据的类型转换等工作都要由 ViewModel
来实现。
ViewModel
会意识到模型 Model
的改变,如果模型 Model
是一个结构体 struct
,那么 Swift
是可以感知到它的变化的。
ViewModel
不会直接与视图 View
对话,也不会持有对视图 View
的指针引用,它只是广播发布 publish
哪些东西发生了改变,视图 View
订阅了这些广播。
ViewModel
还会传递意图,将要对模型 Model
进行的改变传递出来,例如对视图 View
进行手势操作后,会调用意图函数改变模型 Model
。
ViewModel
知道模型 Model
的一切。
函数参数可以有两个标签,一个作为外部调用时使用,另一个作为内部描述使用。
结构体的拷贝只会在发生改变的时候才真实发生拷贝,其他时间都是使用同一份拷贝的。
ViewModel
一定是一个类。因为类存储在堆上,所以容易用来分享,View
可以使用指针引用 ViewModel
结构体是函数式编程,类是面向对象的编程。
结构体的可变性要明确指明,类总是可变的。
结构体 | 类 |
---|---|
值类型 | 引用类型 |
传递赋值拷贝 | 传递指针 |
只在内容真的发生改变时才拷贝 | 自动引用计数 |
函数式编程 | 面向对象编程 |
无继承 | 单一继承 |
默认构造器会初始化所有成员变量 | 默认构造器不会初始化任何成员变量 |
Swift
是强类型语言,所有的值都需要类型,但如果不 care
类型时可以使用泛型。