MVC 架构介绍
基本概念
- M:模型(Model),视图类所需的数据,如:列表展示的数据。
- V:视图(View),构建UI的类,如:button、label、imageView等。
- C:控制器(Controller),连接视图类和模型类,任务是使数据显示在屏幕上。如:控制器将表格需要使用的数据“填入”表格视图中,将表格视图显示出来。
通信方式
MVC 通信方式如下图所示:
由上图可以看出:
- Controller可以直接访问Model
- Controller可以直接访问View
- View、Model两者不能相互访问
1. View到Controller的通信
-
:标准化匿名通信,用户与视图交互触发控制器的方法。例如:点击按钮后实现视界面跳转,网络请求,刷新UI等。目标动作机制(target-action)
-
:有更复杂的通用UI组件,比如一个代理机制(delegate)
滑动至最底部,需要告诉UIScrollView
并询问,还能继续滚动吗?Controller
-
:列表视图(数据源机制(dataSource)
)不能处理数据,需要tableView
来帮助处理数据。如:数据存储在Model,Controller访问Model,取出数据给tableView展示。Controller
2. Model到Controller的通信
类似电台机制的两种模式:
- 通知(Notification)
- 键值监听(KVO,Key Value Observe)
结构体(struct)
在
C
语言中
结构体(struct)
就是某种存储少量数据的类型,不是什么重要的东西。但在
Swift
中
struct
和
类(class)
基本是一样的,它们都可以有方法、有变量。
不过它们也是有区别的,主要有两点:
-
没有继承,所以比struct
简单一些class
-
是值类型,而struct
是引用类型class
值类型:
当我们把它作为参数传入函数、放入数组中,亦或者把赋值给另一个变量,它都会被拷贝。
引用类型:
它们被存储在堆(heap)中,保留指向它的指针,当传递它的时候,不会把对象四处传递,
传递的只是指针。我们可能有很多代码,都拥有指向同一个对象的指针。
复制代码
懒加载(lazy)
意味着不会被初始化,直到有需要时才会被初始化。
运算符
1. for...in
// 半开区间运算符
for index in 0..<[Any].count { // do something }
// 闭合区间运算符
for index in 0...[Any].count { // do something }
// 以上两种均可写成
for index in [Any].indices { // do something }
复制代码
:按升序对收集进行下标的索引。返回的是
indices
CountableRange<Int>
2. 三目运算符
a > b ? a : b
复制代码
3. 比较运算符
a == b 等于
a != b 不等于
a > b 大于
a < b 小于
a >= b 大于等于
a <= b 小于等于
复制代码
注意:
Swift
也提供恒等(
===
)和不恒等(
!==
)这两个比较符来判断两个对象是否引用同一个对象实例。
4. 控制流
比较运算都返回了一个标识表达式是否成立的布尔值(bool):
if a == b {
// do something
} else {
// do something
}
复制代码
Type(static)Method
static var identifierFactory = 0
static func getUniqueIdentifier() -> Int {
identifierFactory += 1
return identifierFactory
}
复制代码
属性观察(Property Observer)
didSet
var flipCount: Int = 0 {
didSet {
flipCountLabel.text = "Flips: \(flipCount)"
}
}
复制代码
小结
以上基本就是第一堂课的知识点,值得注意的是,
struct
和
class
的区别很重要。
Array、Int、Dictionary等都是结构体,传递时会被拷贝。
可选类型(Optional):
- 有值
- 无值(nil)
应该特别注意,否则很容易导致程序crash。