Swift学习笔记(五)属性、方法、下标

1. 属性
①存储类型
常量:let
变量:var
常量结构体里的属性都为常量类型,因为结构体是值类型
[c]
let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
// 该区间表示整数0,1,2,3
rangeOfFourItems.firstValue = 6
// 尽管 firstValue 是个变量属性,这里还是会报错
[/c]
②延迟存储属性
[c]
lazy var importer = DataImporter()
[/c]
※注意lazy初始化之前多线程访问,无法保证只初始化一次
③计算属性
[c]
struct AlternativeRect {
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 {
origin.x = newValue.x – (size.width / 2)
origin.y = newValue.y – (size.height / 2)
}
}
}
[/c]
只有 getter 没有 setter 的计算属性就是只读计算属性。必须使用 var 关键字定义
[c]
struct Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume: Double {
//get关键字和{}可以省略
return width * height * depth
}
}
let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")
// 打印 "the volume of fourByFiveByTwo is 40.0"
[/c]
④属性观察器
可以为属性添加如下的一个或全部观察器:
willSet 在新的值被设置之前调用
didSet 在新的值被设置之后立即调用
[c]
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added \(totalSteps – oldValue) steps")
}
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps
[/c]
※父类的属性在子类的构造器中被赋值时,它在父类中的 willSet 和 didSet 观察器会被调用,随后才会调用子类的观察器。
⑤全局属性和局部属性
全局变量是在函数、方法、闭包或任何类型之外定义的变量。
局部变量是在函数、方法或闭包内部定义的变量。
※全局的常量或变量都是延迟计算的。
※局部范围的常量或变量从不延迟计算。
⑥类型属性
使用关键字 static 来定义类型属性。
在为类定义计算型类型属性时,可以改用关键字 class 来支持子类对父类的实现进行重写。

2. 方法
①实例方法(同java中的动态方法)
方法就是函数与某个类型关联,类型的每一个实例都有一个隐含属性叫做self,self完全等同于该实例本身。
②在实例方法中修改值类型
可变方法关键字:mutating
可变方法能够赋给隐含属性self一个全新的实例。
[c]
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
self = Point(x: x + deltaX, y: y + deltaY)
}
}
[/c]
③类型方法(同java中的静态方法)
在方法的func关键字之前加上关键字static,来指定类型方法。
类还可以用关键字class来允许子类重写父类的方法实现。

3. 下标
①语法
与定义实例方法类似,定义下标使用subscript关键字,有点类似计算属性
[c]
subscript(index: Int) -> Int {
get {
// 返回一个适当的 Int 类型的值
}

set(newValue) {
// 执行适当的赋值操作
}
}
[/c]
例如,Swift 的Dictionary类型实现下标用于对其实例中储存的值进行存取操作。
[c]
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2
[/c]