WWDC之Intermediate to Swift

前言

Session进一步讲解了关于Swift语言中的语法特性和设计特点,主要内容涉及:

  • Optional可选类型
  • 内存管理
  • 初始化构造
  • Closures闭包
  • 模式匹配

内容

Optionals

WWDC之Intermediate to Swift_第1张图片
Optional总览
  • 针对其值不确定是否存在的变量Optional类型来声明;声明后存在两种状态,一种为有值状态,另一种为nil状态即无值状态(直接声明为可选类型未设初始值时默认值为nil,其处于第二种状态)

  • 只有可选类型变量才能赋值为nil,对于非可选类型(平常的String,Int, Array,类等)设为nil会出现编译错误.
    让某一类型变量成为可选类型,在其平常的类型后加?Int?, String?, UIVew?,想要直接获取其可选类型变量内部的值,在其变量名后加!(强制解包符号),若在其为nil的情况下进行强制解包会造成运行时错误,使用前提必须保证在不为nil情况下进行取值操作,因此官方不推荐使用!强制解包符号进行对可选类型变量的取值.代替的方案为使用if-let句式进行可选绑定操作,利用临时变量来存可选变量真正的值,形式如下:

if let value = OptionalValue {
    print("the real value is \(value)")
} else {
    print(it's nil);
}
  • 可选链,针对在多个可选变量层级获取情况下所应对的快速简便语法,形成链式语式,其中有一个可选变量为nil则无需再向下访问直接返回nil,即使最终全程可选类型访问有效且有值,使用时仍要进行解包操作,其原来返回也是可选类型的变量.
let value = optionalValueA?.optionalValueB?.optionalValueC?.optionalValueD? // still Optional Value`
  • 可选类型内部结构为一个泛型的枚举,两个分支,默认为None分支即变量被设为nil,也可以显示设置为nil;另一个则为接受任何类型的变量为关联值的Some分支,使得可选类型变量可以在有值的情况通过解包获取所存在的值.
enum Optional {
    case None
    case Some(T)
}
WWDC之Intermediate to Swift_第2张图片
演讲者对`Optional`变量的形象比喻

Swift的内存管理

WWDC之Intermediate to Swift_第3张图片
内存管理总览
  • 继续沿用Objective-C自动引用计数机制进行内存管理,绝多数情况下Swift替开发者进行内存管理;

  • 存在强引用的对象的内存不会被系统回收,直至该对象上无强引用;

  • 应对对象间循环引用的情况,Swift提供两种解决方法

    WWDC之Intermediate to Swift_第4张图片
    对应循环引用-

    • 使用weak关键字,使用弱引用指向对象,类似Objective-Cweak属性,在弱引用指向的对象释放后其原变量会被设为nil(也说明weak声明的变量必须为可选类型且用var声明,在赋值、调用方法时需要解包操作)
    • 使用unowned关键字,表示不会对引用计数进行+1的引用,所引用的对象释放后也不会被设置为nil,允许用let声明的非可选类型变量,类似于Objective-Cunsafe_unretain属性

初始化构造

WWDC之Intermediate to Swift_第5张图片
初始化总览
  • 根本原则: 所有值在对象实例使用前必须都已被初始化(包括设为nil).

  • 构造方法init(..){...} 内部不允许在所有属性未初始化前调用方法(内部的方法调用实则隐式的self实例调用,违背构造根本原则)

  • 结构体:
    能自动生成构造方法;
    若存在没有初始化或无默认值的属性,会生成相应的构造方法设置其属性的初始值;

  • 类:
    由于继承的特性,构造方法被继承时,需要使用super调用,注意调用时机,在所有本类属性初始化后才能进行父类初始化方法调用.
    允许在调用父类初始化方法后,进行对继承的属性进行再一次修改和操作.
    类的初始化方法分为DesignatedConvenience两种,若存在父类,Designated构造方法都要调用其父类的Designated构造方法,而Convenience构造方法还是依靠Designated构造方法进行实例初始化;
    有继承的类在所有属性都已有初始值的情况下,允许不实现自己的构造方法,自动继承父类的所有DesignatedConvenience构造方法,若自己定义了构造方法,则不会继承父类的构造方法;

  • 属性的懒加载: 想让编译器知道该属性只有到需要访问时才会初始化使用@lazy关键字,并赋值为初始化完整的实例@lazy var manager = Manager()

  • 析构方法:一般移除KOV或者通知的观察者,关闭文件,释放资源时才会用到.

闭包

一般写法

let closure = { (a, b) -> Bool in
    return true
}

标准库闭包

  • sort 排序闭包
  • filter 过滤闭包
  • map 映射闭包
  • reduce 折合闭包

值捕获:
能自动获取上下文变量,进行访问和设置.
闭包和函数都是一种ARC对象,内部能引用和持有其他ARC对象,支持ARC内存管理机制
在值捕获过程中产生的循环引用,应对方法使用unowned关键字

WWDC之Intermediate to Swift_第6张图片
应对循环应用二

模式匹配

WWDC之Intermediate to Swift_第7张图片
模式匹配总览
  • Switch支持类实例对象,数据范围的匹配
  • 枚举允许设置关联值,结合Switch,访问关联值
  • 提供元组匹配,在switch中使用元组作为分支,并且支持where的额外条件匹配

结尾

整体看下来,体会到了Swfit语言对安全性和便利性的不断追求,不论从使用可选类型,遵循构造方法原则都体现着Swift安全这一特性,目的就是为了让开发者能更加安全,有效地编码.

你可能感兴趣的:(WWDC之Intermediate to Swift)