06.属性&方法&构造
目录介绍
- 6.1 属性
- 6.1.1 存储属性
- 6.1.2 延迟存储属性
- 6.1.3 计算属性
- 6.1.4 只读计算属性
- 6.1.5 属性观察器
- 6.1.6 全局变量和局部变量
- 6.1.7 类型属性
- 6.1.8 获取和设置类型属性的值
- 6.2 方法
- 6.2.1 实例方法
- 6.2.2 self属性
- 6.2.3 类型方法
- 6.3 构造
- 6.3.1 构造过程
- 6.3.2 构造器
- 6.3.3 默认属性值
- 6.3.4 构造参数
- 6.3.5 内部和外部参数名
- 6.3.6 可选属性类型
- 6.3.7 类的继承和构造过程
- 6.3.8 构造器的继承和重载
- 6.4 析构
- 6.4.1 析构过程
- 6.4.2 析构过程原理
- 6.4.3 析构语法
6.3.1 构造过程
构造过程是为了使用某个类、结构体或枚举类型的实例而进行的准备过程。这个过程包含了为实例中的每个属性设置初始值和为其执行必要的准备和初始化任务。
Swift 构造函数使用 init() 方法。
与 Objective-C 中的构造器不同,Swift 的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化。
类实例也可以通过定义析构器(deinitializer)在类实例释放之前执行清理内存的工作。
6.3.4 构造参数
你可以在定义构造器 init() 时提供构造参数,如下所示:
struct Rectangle {
var length: Double
var breadth: Double
var area: Double
init(fromLength length: Double, fromBreadth breadth: Double) {
self.length = length
self.breadth = breadth
area = length * breadth
}
init(fromLeng leng: Double, fromBread bread: Double) {
self.length = leng
self.breadth = bread
area = leng * bread
}
}
let ar = Rectangle(fromLength: 6, fromBreadth: 12)
print("面积为: \(ar.area)")
let are = Rectangle(fromLeng: 36, fromBread: 12)
print("面积为: \(are.area)")
6.3.7 类的继承和构造过程
6.3.8 构造器的继承和重载
Swift 中的子类不会默认继承父类的构造器。
父类的构造器仅在确定和安全的情况下被继承。
当你重写一个父类指定构造器时,你需要写override修饰符。
class SuperClass {
var corners = 4
var description: String {
return "\(corners) 边"
}
}
let rectangle = SuperClass()
print("矩形: \(rectangle.description)")
class SubClass: SuperClass {
override init() { //重载构造器
super.init()
corners = 5
}
}
let subClass = SubClass()
print("五角型: \(subClass.description)")
6.4 析构
6.4.1 析构过程
在一个类的实例被释放之前,析构函数被立即调用。用关键字deinit来标示析构函数,类似于初始化函数用init来标示。析构函数只适用于类类型。
6.4.2 析构过程原理
Swift 会自动释放不再需要的实例以释放资源。
Swift 通过自动引用计数(ARC)处理实例的内存管理。
通常当你的实例被释放时不需要手动地去清理。但是,当使用自己的资源时,你可能需要进行一些额外的清理。
例如,如果创建了一个自定义的类来打开一个文件,并写入一些数据,你可能需要在类实例被释放之前关闭该文件。
6.4.3 析构语法
var counter = 0; // 引用计数器
class BaseClass {
init() {
counter += 1;
}
deinit {
counter -= 1;
}
}
var show: BaseClass? = BaseClass()
print(counter)
show = nil
print(counter)
当 show = nil 语句执行后,计算器减去 1,show 占用的内存就会释放。