天天看点

斯坦福iOS Swift开发公开课总结(一)MVC 架构介绍结构体(struct)懒加载(lazy)运算符Type(static)Method属性观察(Property Observer)小结

MVC 架构介绍

基本概念

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

通信方式

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)

就是某种存储少量数据的类型,不是什么重要的东西。但在

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。