Swift(class)
类
简介
swift的类和c++的类基本相似,这里整理不同的地方,以突显其独有特性
1.属性
swift class的属性有三种:存储属性,计算属性和类型属性。存储属性存储常量或变量作为实例的一部分,而计算属性计算(不是存储)一个值。类型属性则直接作用于类型本身,而不是类的实例。
一个典型例子:
struct Point {
var x = 0.0, y = 0.0//存储属性
}
struct Size {
var width = 0.0, height = 0.0
}
struct Rect {
static let noUseVar = 0//类属性
var origin = Point()
var size = Size()
var center: Point {//计算属性
get {
let centerX = origin.x + (size.width / 2)
let centerY = origin.y + (size.height / 2)
return Point(x: centerX, y: centerY)
}
set(newCenter) {
origin.x = newCenter.x - (size.width / 2)
origin.y = newCenter.y - (size.height / 2)
}
}
}
计算属性并不存储真实的值,而只是一种计算载体,提供获取 Rect 实例的 center 的方法。只有 getter 没有 setter 的计算属性就是只读计算属性。
必须使用var关键字定义计算属性,包括只读计算属性,因为它们的值不是固定的。 关键字只用来声明 常量属性,表示初始化后再也无法修改的值。
2.属性观察器
属性观察器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性观察器,即使新值和当前值相同的 时候也不例外。
可以为属性添加如下的一个或全部观察器:
- willSet:在新的值被设置之前调用
- didSet:在新的值被设置之后立即调用
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added \(totalSteps - oldValue) steps")
}
}
}
}
oldValue表示旧值的参数名
3.延迟属性、防止重写属性
延迟属性(存储属性)是指当第一次被调用的时候才会计算其初始值的属性,在属性声明前使用lazy来标示一个延迟存储属性:lazy var v = 0
必须将延迟存储属性声明成变量(使用 var 关键字)
var类属性默认是延迟属性(?)
通过final关键字表示一个属性、方法或类是不可重写(或继承)的
例如:final var,final func, final class
4.swift class的引用性质
struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
let hd = Resolution(width:640, height: 480)
//hd.width = 2
let v1 = VideoMode()
v1.frameRate=0.3
let v2 = v1
v2.frameRate=0.8
print(v1.frameRate)//0.8
以上v2和v1都是一个VideoMode实例的引用,因此虽然v2和v1都是let的,但是依然可以修改v2.frameRate=0.8
5.构造函数
swift class通过关键字init定义构造函数:
struct Color {
let red, green, blue: Double
init(red: Double, green: Double, blue: Double) {
self.red = red
self.green = green
self.blue = blue
}
init(white: Double) {
red = white
green = white
blue = white
} }
既已览卷至此,何不品评一二: