一: 存储属性
二: 计算属性
三: 枚举rawValue
四: 延迟存储属性
五: 属性观察器
六: setter&getter方法 局部变量& 全局变量
七: 类型属性
八: 单例
一: 属性
结构体和类可以定义存储属性
1 存储属性 为什么叫存储属性, 对象存储在结构体,类的实例中
截屏2022-05-01 下午6.42.29.png
1 存储属性
截屏2022-05-01 下午6.43.31.png
截屏2022-05-01 下午6.47.11.png
存储属性总结: 作用是存储数据
定义时候要有初始值 var age: int = 18 , 或者在初始化器里面赋值
枚举没有存储属性, 结构设计如此, 枚举占1个字节,区分case及关联值
2 计算属性
截屏2022-05-01 下午6.43.40.png
截屏2022-05-01 下午6.59.06.png
计算属性总结:
作用: 处理两个属性的关系(计算其他存储属性的值) 写在set方法里面, get返回计算属性的值,
语法: 默认的形参是newValue 除非重新定义,
如图自定义形参是newDiameter, set方法设置存储属性半径大小, get获取计算属性半径, 其值是半径2倍,
计算属性本质是方法, 不占用实例的内存
注意!!! 计算属性后面没有 "="
计算属性----枚举 rawValue
截屏2022-05-01 下午7.19.28.png
1 原始值 指定枚举类型, 会自动设置原始值
enum grade: String {
case perfect = "A"
case great = "B"
case good = "C"
case bad = "D"
}
print(grade.perfect.rawValue) // A
print(grade.great.rawValue) // B
print(grade.good.rawValue) // C
print(grade.bad.rawValue) // D
2 隐式原始值
如果枚举的原始值类型是Int String, Swift会自动分配原始值
就是你不写原始值, 但是他会自动生成原始值!!!
enum Direction: String {
case north
case south
case east
case west
}
var score3 = Direction.east; // 枚举对象
var score4 = Direction.east.rawValue // string类型
// 注意上面这俩不是一回事, 上面这个枚举对象, 下面这个是枚举对象rawValue
print(Direction.east.rawValue) // east
print(Direction.south.rawValue) // south
print(Direction.west.rawValue) // west
print(Direction.north.rawValue) // north
枚举原始值: 枚举指定String Int类型会默认生成rawValue
rawValue本质是个计算属性
3 延迟存储属性
截屏2022-05-01 下午7.31.42.png
截屏2022-05-01 下午7.45.15.png
@objcMembers class FTLearnSwift: FTBaseViewController {
// 存储属性
lazy var image: UIImage = { // 注意 有等于号 闭包表达式 赋值存储属性
return UIImage(named: "") ?? UIImage()
}()
// 注意 有等于号 闭包表达式 赋值存储属性, 后面是个闭包表达式类似调用个函数赋值了
lazy var image1: UIImage = UIImage(named: "") ?? UIImage() // 直接定义存储属性
截屏2022-05-01 下午7.32.22.png
就是 let 修饰了结构体, 内存就固定了, 不允许修改 所以调用延迟存储属性z报错
但是使用x, y没问题
延迟存储属性作用:
调用创建, 懒加载, 本质是存储属性
3 属性观察器
截屏2022-05-01 下午8.09.25.png
@objcMembers class FTLearnSwift: FTBaseViewController {
// 属性观察器
var circle: Double {
willSet {
print("----willset----")
}
didSet {
print("----didset----")
}
}
init() {
circle = 10
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
circle = 10.5
// ----willset---- 10.5
// ----didset---- 10.0 10.5
}
struct Circle {
var radius: Double = 20 { // 这是个存储属性 这里可以赋值20!!!
willSet { // 注意: TTM可以赋值初始值, 这个计算属性不行
print("----willset----",newValue)
}
didSet {
print("----didset----",oldValue,radius) // newValue这里掉不了
}
}
init() {
}
}
属性观观察器:
作用: 监听set, get方法属性值改变
注意: 类似计算属性, 但是可以赋值默认值
注意 初始化init写是不会触发属性观察器的
4 对比 setter/ getter 方法 & 局部变量,全局变量
截屏2022-05-01 下午8.45.30.png
截屏2022-07-12 10.15.34.png
总结:
局部变量, 全局变量也可以用属性观察器
属性观察器可以添加默认值,
5 inout再次研究 分析计算属性& 存储属性本质
截屏2022-05-01 下午8.48.22.png
结论:
1 存储属性: test函数传存储属性, 是将存储属性的地址传进去,修改存储属性的地址值
2 计算属性: 计算属性没有内存地址的, 本质是函数调用, test函数传入计算属性,先调用get方法获取变量值,放到局部变量, 在调用set方法,局部变量值传给set方法赋值
截屏2022-05-01 下午8.49.29.png
6 类型属性
截屏2022-05-02 下午5.08.11.png
static var age: Int = 18
// Static stored properties not supported in generic types 泛型类中不支持类型属性
static var name: String {
"jack"
}
override func viewDidLoad() {
super.viewDidLoad()
let age = FTXibViewController.age
let name = FTXibViewController.name
}
截屏2022-05-02 下午5.08.25.png
截屏2022-05-02 下午5.32.28.png
类型属性总结: static
作用 类名调用属性
注意static 可以修饰存储属性, 也可以修饰计算属性, 默认延迟初始化lazy
枚举可以不能定义存储属性, 但是可以定义类型属性
7: 单例
截屏2022-05-02 下午5.37.46.png
// private init 你调用不了init方法
网友评论