斯坦福iOS Swift开发公开课总结(一)

422 阅读3分钟

MVC 架构介绍

基本概念

  • M:模型(Model),视图类所需的数据,如:列表展示的数据。
  • V:视图(View),构建UI的类,如:button、label、imageView等。
  • C:控制器(Controller),连接视图类和模型类,任务是使数据显示在屏幕上。如:控制器将表格需要使用的数据“填入”表格视图中,将表格视图显示出来。

通信方式

MVC 通信方式如下图所示:

MVC

由上图可以看出:

  • Controller可以直接访问Model
  • Controller可以直接访问View
  • View、Model两者不能相互访问

1. View到Controller的通信

  • 目标动作机制(target-action):标准化匿名通信,用户与视图交互触发控制器的方法。例如:点击按钮后实现视界面跳转,网络请求,刷新UI等。
  • 代理机制(delegate):有更复杂的通用UI组件,比如一个UIScrollView滑动至最底部,需要告诉Controller并询问,还能继续滚动吗?
  • 数据源机制(dataSource):列表视图(tableView)不能处理数据,需要Controller来帮助处理数据。如:数据存储在Model,Controller访问Model,取出数据给tableView展示。

2. Model到Controller的通信

类似电台机制的两种模式:

  • 通知(Notification)
  • 键值监听(KVO,Key Value Observe)

结构体(struct)

C语言中结构体(struct)就是某种存储少量数据的类型,不是什么重要的东西。但在Swiftstruct类(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)"
        }
    }

小结

以上基本就是第一堂课的知识点,值得注意的是,structclass的区别很重要。

Array、Int、Dictionary等都是结构体,传递时会被拷贝。

可选类型(Optional):

  • 有值
  • 无值(nil)

应该特别注意,否则很容易导致程序crash。