属性
1.存储属性 就是存储在特定类或者结构体的实例的一个变量或者常量
struct FixedLengthRange {
var firstValue = 3
var length = 4
}
let fixLengthRange = FixedLengthRange()
print(fixLengthRange.firstValue)
//fixLengthRange.firstValue = 4 因为fixLengthRange 是常量,其所有的属性值都不能在被修改
class dataImporter {
var fileName = "test.txt"
}
class dataManager {
//必须被初始化
lazy var importer = dataImporter()
var data = [String]()
}
let manager = dataManager()
//importer现在还没被创建
manager.data.append("some data")
manager.data.append("another data")
print(manager.importer.fileName)//importer现在被创建
2.计算属性
struct Point {
var x = 0.0 ,y = 0.0
}
struct Size {
var width = 0.0 ,height = 0.0
}
struct Rect {
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)
}
//1.第一种setter方式
//set(newCenter){
//origin.x = newCenter.x - (size.width/2)
//origin.y = newCenter.y - (size.height/2)
//}
//2.第二种setter方式
set{
origin.x = newValue.x - (size.width/2)
origin.y = newValue.y - (size.height/2)
}
}
}
var square = Rect(origin:Point(x: 3, y: 3), size:Size(width: 3, height: 3))
print(square)
//如果一个计算属性只是可读的,可以省略get{}
struct Cubiod {
var width = 0.0
var volume :Double {
return width * width * width
}
}
3.属性观察器 observer
willSet :在属性的值在被赋值之前调用
didSet:在属性的值被赋值之后调用
class StepCounter {
var totalSteps:Int = 0 {
willSet{
print("totalSteps is \(newValue)")
}
didSet{
if totalSteps > oldValue{
print("totalSteps is big than oldValue")
}
}
}
}
var stepCounter = StepCounter()
stepCounter.totalSteps = 10
//类属性,用static来声明,用类或者结构体、枚举来访问,而不是类或者结构体、枚举的实例对象也访问