Swift中和实例相关的属性可以分为2大类:存储属性、计算属性
一、存储属性(Stored Property)
a、在创建类、结构体实例时,必须为所有的存储属性设置一个合适的初始值
b、可以在初始化器里为存储属性设置一个初始值
c、可以分配一个默认的属性值作为属性定义的一部分
d、存储在实例的内存中 e、结构体、类可以定义存储属性 f、枚举不可以定义存储属性
//例
struct Circle {
var radius: Double
var dimater: Double{
set{
radius = newValue / 2
}
get{
radius * 2
}
}
}
二、计算属性(Computed Property)
a、传入的新值默认叫做newVBalue ,只读计算属性:只有get,没有set
b、定义计算属性只用能var ,不用能let c、本质就是方法(函数),不占用内存 d、枚举、结构体、类都可以定义计算属性
三、延迟存储属性(懒加载)lazy
使用lazy可以定义一个延迟存储属性,在第一次用到属性的时候才会进行初始化
a、lazy 属性必须是var ,不能是let
b、如果多线程同时第一次访问lazy属性,(无法保证属性只被初始化1次)
警告!
当结构体包含一个延迟存储属性时,只有var才能访问延迟存储属性,因为延迟属性初始化时需要改变结构体的内存
//例 1
class Calumator{
var x: Int = 5
var y: Int = 6
var sum: Int{
set {y = newValue - x}
get {x + y}
}
}
let cal = Calumator()
print(cal.sum) // get 11
cal.sum = 20 // set y = 20 - 5 = 15
print(cal.y)//15
如果只有get,没有set方法时可以简写.但是不能再赋值
例2 只读属性 ,只有get ,没有set
struct Circle {
var radius:Double
var diameter:Double{
get{ radius * 2}
}
}
例3 可以省略get
struct Circle1 {
var radius:Double
var diameter:Double{radius * 2 }
}
四、属性观察器(Property Observer)
a、可以为非lazy 的var存储属性设置属性观察器
b、在初始化器中设置属性值不会触发:willSet和didSet
c、在属性定义时设置初始值也不会触发willSet和didSet
d、willSet 会传递新值,默认叫 newValue
e、didSet 会传递旧值,默认叫 oldValue
struct Circle {
var radius: Double{
willSet{
print("willSet= \(newValue)")
}
didSet{
print("didSet= \(oldValue) radius= \(radius)")
}
}
init() {
self.radius = 10
print("init")
}
}
var circle = Circle() // init
circle.radius = 45
//willSet= 45.0 didSet= 10.0 radius= 45.0
五、单例
public class FileManager{
public static let shared = FileManager()
private init(){}
}