Swift笔记-访问控制

访问控制可以限定其他源文件或模块中代码对你代码的访问级别。

Swift 为代码中的实体提供了四种不同的访问级别:public、internal、fileprivate、private。

Swift笔记-泛型

Swift 提供了泛型让你写出灵活且可重用的函数和类型。
Swift 标准库是通过泛型代码构建出来的。
Swift 的数组和字典类型都是泛型集。

泛型使用了占位类型名(在这里用字母 T 来表示)来代替实际类型名(例如 Int、String 或 Double)。

Swift笔记-协议

协议规定了用来实现某一特定功能所必需的方法和属性。

语法

1
2
3
protocol SomeProtocol {
// 协议内容
}

要使类遵循某个协议,需要在类型名称后加上协议名称,中间以冒号:分隔,作为类型定义的一部分。遵循多个协议时,各协议之间用逗号,分隔。

Swift笔记-扩展

扩展就是向一个已有的类、结构体或枚举类型添加新功能。
扩展可以对一个类型添加新的功能,但是不能重写已有的功能。

Swift 中的扩展可以:

  • 添加计算型属性和计算型静态属性
  • 定义实例方法和类型方法
  • 提供新的构造器
  • 定义下标
  • 定义和使用新的嵌套类型
  • 使一个已有类型符合某个协议

Swift笔记-类型转换

Swift 中类型转换使用 is 和 as 操作符实现,is 用于检测值的类型,as 用于转换类型。

检查类型

类型检查使用 is 关键字。

操作符 is 来检查一个实例是否属于特定子类型。若实例属于那个子类型,类型检查操作符返回 true,否则返回 false。

Swift笔记-自动引用计数

Swift 使用自动引用计数(ARC)这一机制来跟踪和管理应用程序的内存
通常情况下我们不需要去手动释放内存,因为 ARC 会在类的实例不再被使用时,自动释放其占用的内存。
但在有些时候我们还是需要在代码中实现内存管理。

ARC 功能

  • 当每次使用 init() 方法创建一个类的新的实例的时候,ARC 会分配一大块内存用来储存实例的信息。
  • 内存中会包含实例的类型信息,以及这个实例所有相关属性的值。
  • 当实例不再被使用时,ARC 释放实例所占用的内存,并让释放的内存能挪作他用。
  • 为了确保使用中的实例不会被销毁,ARC 会跟踪和计算每一个实例正在被多少属性,常量和变量所引用。
  • 实例赋值给属性、常量或变量,它们都会创建此实例的强引用,只要强引用还在,实例是不允许被销毁的。

Swift笔记-可选链

使用感叹号(!)可选链实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Person {
var residence: Residence?
}

class Residence {
var numberOfRooms = 1
}

let john = Person()

//将导致运行时错误
let roomCount = john.residence!.numberOfRooms

//fatal error: unexpectedly found nil while unwrapping an Optional value

想使用感叹号(!)强制解析获得这个人residence属性numberOfRooms属性值,将会引发运行时错误,因为这时没有可以供解析的residence值。

Swift笔记-析构过程

在一个类的实例被释放之前,析构函数被立即调用。

用关键字deinit来标示析构函数,类似于初始化函数用init来标示。析构函数只适用于类类型。

  • Swift 会自动释放不再需要的实例以释放资源。
  • Swift 通过自动引用计数(ARC)处理实例的内存管理。
  • 通常当你的实例被释放时不需要手动地去清理。但是,当使用自己的资源时,你可能需要进行一些额外的清理。

Swift笔记-继承

在 Swift 中,类可以调用和访问超类的方法,属性和下标脚本,并且可以重写它们。

基类

没有继承其它类的类,称之为基类(Base Class)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class StudDetails {
var stname: String!
var mark1: Int!
var mark2: Int!
var mark3: Int!
init(stname: String, mark1: Int, mark2: Int, mark3: Int) {
self.stname = stname
self.mark1 = mark1
self.mark2 = mark2
self.mark3 = mark3
}
}
let stname = "swift"
let mark1 = 98
let mark2 = 89
let mark3 = 76

let sds = StudDetails(stname:stname, mark1:mark1, mark2:mark2, mark3:mark3);

print(sds.stname)
print(sds.mark1)
print(sds.mark2)
print(sds.mark3)
//swift
//98
//89
//76

Swift笔记-下标脚本

语法

定义下标脚本使用subscript关键字,显式声明入参(一个或多个)和返回类型。

1
2
3
4
5
6
7
8
9
subscript(index: Int) -> Int {
get {
// 用于下标脚本值的声明
}
set(newValue) {
// 执行赋值操作
}
}