存储属性
-
存储属性是会
占用
实例对象的内存 -
可以通过
var
,let
来声明 -
结构体和类
都支持存储属性 -
结构体属于
值类型
,实例赋值给常量,所有属性都成了常量, 不能修改
struct Teacher {
let name = ""
var age = 0
}
var teacherA = Teacher()
teacherA.age = 30
teacherA.name = "TeacherA" //报错
let teacherB = Teacher()
teacherB.age = 30 //报错
teacherB.name = "TeacherB" //报错
复制代码
- 类是引用类型,不管赋给变量还是常量,都可以修改变量属性的值
class Teacher1 {
let name = ""
var age = 0
}
var teacher1 = Teacher1()
teacher1.age = 30
//teacher1.name = "TeacherA" //报错
let teacher2 = Teacher1()
teacher2.age = 30
//teacher2.name = "TeacherB" //报错
复制代码
延迟存储属性 lazy
- 第一次被调用时才初始化
- lazy修饰的变量,必须有一个默认的初始值
class Friend{
//!会自动解包
var name: String!
init() {
print("Friend 初始化")
}
}
class Hobby{
var name: String!
init() {
print("Hobby 初始化")
}
}
class Student {
var name: String!
var hobby :Hobby = Hobby()
lazy var friend:Friend = Friend()
}
//属性 hobby 会随着 Student 初始化而初始化
//lazy修饰的属性friend 在使用时才执行初始化
var stu = Student()
stu.friend.name = "韩梅梅"
//Hobby 初始化
//Friend 初始化
复制代码
计算属性 get set
- 不会存储值,
不占用
实例对象的内存 - 只能用关键字
var
声明, 值是不固定的 - 提供getter和可选setter
- 本质是
get和set方法
,存放在元数据(Metadata)中
class Square {
var width: Double = 8.0
var area: Double {
get {
return width * width
}
//默认名称 newValue
set (newValue){
width = sqrt(newValue)
}
}
}
let s = Square()
print(s.area)
s.area = 25.0
print(s.width)
//64.0
//5.0
复制代码
class_getInstanceSize(Square.self) // 24
复制代码
只读计算属性 get
- 只有
getter
方法,没有setter
方法 - 可省略
get{}
class Square1 {
var width: Double = 8.0
var area: Double {
get {
return width * width
}
}
}
class Square2 {
var width: Double = 8.0
var area: Double {
return width * width
}
}
复制代码
属性观察者 willset didset
class Square3 {
var area: Double = 0.0 {
willSet {
print("newValue -- \(newValue) , value --\(area)")
}
didSet {
print("oldValue -- \(oldValue), value --\(area)")
}
}
}
let s3 = Square3()
s3.area = 18
//newValue -- 18.0 , value --0.0
//oldValue -- 0.0, value --18.0
复制代码
类型属性 static class
- 类型属性必须有默认值
class Person {
static var age: Int = 0
}
let age = Person.age
print(age)
复制代码
- 使用
class
来代替static
定义类型属性 - 区别,
class
允许子类重写父类
的实现
class Person {
static var name:String = "person"
static var age:Int {
return 15
}
class var hobby:String {
return "hobby"
}
}
class Student:Person {
class override var hobby: String {
return "student"
}
}
复制代码
static单例
- static关键字是线程安全的,并只初始化一次
- 使用static来创建单例
class Animal {
static let sharedInstance = Animal()
private init() {
}
}
let a = Animal.sharedInstance
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END