美文网首页
Swift八 属性&setter/getter&单例

Swift八 属性&setter/getter&单例

作者: 看谷秀 | 来源:发表于2022-05-02 17:50 被阅读0次

一: 存储属性
二: 计算属性
三: 枚举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方法

相关文章

网友评论

      本文标题:Swift八 属性&setter/getter&单例

      本文链接:https://www.haomeiwen.com/subject/aztpyrtx.html