2019-12-02 swift5 个人笔记 ③

25,构造过程

构造过程是使用类 结构体 枚举类型之前的准备过程,在使用新实例之前构造过程是必须得.与oc的构造器不同.swift的构造器没有返回值,它们的任务是保证新实例在第一次使用前完成正确的初始化

//构造器用init关键字命名
init() {
    // 在此处执行构造过程
}

//默认构造器 所有属性提供了默认值,又没有提供任何自定义的构造器,那么swift会给提供一个默认的构造器 这个默认的构造器会简单地创建一个所有属性都设置为他们默认值的实例
class ShoppingListItem {
    var name: String?
    var quantity = 1
    var purchased = false
}
var item = ShoppingListItem()

由于 ShoppingListItem 类中的所有属性都有默认值,且它是没有父类的基类,它将自动获得一个将为所有属性设置默认值的并创建实例的默认构造器(由于 name 属性是可选 String 类型,它将接收一个默认 nil 的默认值,尽管代码中没有写出这个值)。上面例子中使用默认构造器创造了一个 ShoppingListItem 类的实例(使用 ShoppingListItem() 形式的构造器语法),并将其赋值给变量 item。

//类的指定构造器的写法跟值类型简单构造器一样:
init(parameters) {
    statements
}

//便利构造器也采用相同样式的写法,但需要在 init 关键字之前放置 convenience 关键字,并使用空格将它们俩分开:
convenience init(parameters) {
    statements
}

类的继承和构造过程

类里面的所有存储型属性——包括所有继承自父类的属性——都必须在构造过程中设置初始值。

Swift 为类类型提供了两种构造器来确保实例中所有存储型属性都能获得初始值,它们被称为指定构造器和便利构造器。

规则 1

指定构造器必须调用其直接父类的的指定构造器。

规则 2

便利构造器必须调用同类中定义的其它构造器。

规则 3

便利构造器最后必须调用指定构造器。

一个更方便记忆的方法是:

指定构造器必须总是向上代理
便利构造器必须总是横向代理

析构过程:只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用

deinit {
}

26,错误处理

//用do-catch处理错误
//你可以使用一个 do-catch 语句运行一段闭包代码来处理错误。如果在 do 子句中的代码抛出了一个错误,这个错误会与 catch 子句做匹配,从而决定哪条子句能处理它。
do {
    try expression
    statements
} catch pattern 1 {
    statements
} catch pattern 2 where condition {
    statements
} catch {
    statements
}

27,类型转换

Any 可以表示任何类型,包括函数类型。
AnyObject 可以表示任何类类型的实例。
只有当你确实需要它们的行为和功能时才使用 Any 和 AnyObject。最好还是在代码中指明需要使用的类型。

28,扩展

扩展可以给一个现有的类,结构体,枚举,还有协议添加新的功能。它还拥有不需要访问被扩展类型源代码就能完成扩展的能力(即逆向建模)。扩展和 Objective-C 的分类很相似。(与 Objective-C 分类不同的是,Swift 扩展是没有名字的。)
swift中没有分类
Swift 中的扩展可以:

  • 添加计算型实例属性和计算型类属性
  • 定义实例方法和类方法
  • 提供新的构造器
  • 定义下标
  • 定义和使用新的嵌套类型
  • 使已经存在的类型遵循(conform)一个协议

在 Swift 中,你甚至可以扩展协议以提供其需要的实现,或者添加额外功能给遵循的类型所使用。你可以从 协议扩展 获取更多细节。

注意

扩展可以给一个类型添加新的功能,但是不能重写已经存在的功能。

extension SomeType {
  // 在这里给 SomeType 添加新的功能
}

扩展可以扩充一个现有的类型,给它添加一个或多个协议。协议名称的写法和类或者结构体一样:

extension SomeType: SomeProtocol, AnotherProtocol {
  // 协议所需要的实现写在这里
}

29,协议

协议定义了一个蓝图,规定了用来实现某一特定任务或者功能的方法,属性,以及其他需要的东西,类结构体枚举都可以遵循协议,并未协议定义的这些要求提供具体的实现,遵循协议的类型必须要实现

//语法
protocol SomeProtocol {
//这里协议定义的部分
}

//要让自定义类型遵循某个协议,在定义类型时,需要在类型名称后面加上协议名称,中间以冒号分开,遵循多个协议时,各协议之间用逗号分隔:
struct SomeStructure: FirstProtocol, AnotherProtocol {
    // 这里是结构体的定义部分
}

//若一个拥有父类的类在遵循协议时,应该将父类名放在协议名前,用逗号分隔:
class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {
    // 这里是类的定义部分
}

属性要求
//协议总是用var 关键字来声明变量属性,在类型声明后加上{set get}来表示属性是可读可写的,可读属性则用{get}来表示
protocol SomeProtocol {
    var mustBeSettable: Int { get set }
    var doesNotNeedToBeSettable: Int { get }
}

方法要求
//协议定义类的方法时,总是使用static关键字作为前缀,即使在类实现时,类方法要求使用class或者static作为关键字前面的规则仍然适用
protocol SomeProtocol {
    static func someTypeMethod()
}

下面的例子定义了一个只含有一个实例方法的协议:

protocol RandomNumberGenerator {
    func random() -> Double
}

委托
是张一种设计模式,它允许类或者结构体将一些需要它们负责的功能托给其他类型的实例 

//防止循环引用
1,弱引用 weak
2,无主引用 unowned

你可能感兴趣的:(2019-12-02 swift5 个人笔记 ③)