美文网首页
Swift 计算属性、存储属性

Swift 计算属性、存储属性

作者: pigLily | 来源:发表于2022-02-16 15:14 被阅读0次

属性

Swift中的属性分为存储属性(sorted variable)和计算型属性(computed variable)

存储型属性就是一般意义上理解的可以进行赋值和取值的变量。
var title = "学科"
计算型属性,字面意思为计算型的属性,这种属性没法存储值

计算型属性

特征:仅有get(readOnly语义)或有get+set的属性是计算型属性,有get+set的属性仅作为其他属性的外部接口

  • 计算型属性本身不占用内存内控,所以不能赋值
    get+set为计算型属性的原因:
    真正赋值的过程是存在于set方法中并被底层包装掉的,如果我们手动实现了set方法,就无法进行正确的赋值


    图片.png

    get+set正确的使用方法:作为其他属性的外部接口

    private var _squre: Double = 0.0
    var squre: Double {
        get {
            return _squre
        }
        set {
            if (newValue <= 0) {
                print("newValue = \(newValue)")
            } else {
                _squre = newValue
            }
        }
    }

存储型属性

ps:初始化方法生成对象,并不会出发属性的willSet didSet方法若想再初始化阶段触发didSet,可以采用KVC的方式给对象初始化

willSet能获取将要赋给属性的值newValue

  • 操作的属性是对旧值操作,会被之后的内部set覆盖掉
  • 作用:观察
    didSet能获取属性之前的旧值oldValue,新值即为属性
  • 操作属性是对新值进行操作
  • 作用:观察、数据加工
  • 当使用了didSet就不能再使用set了,因为didSet中已经包含了set状态
class TestCard {
    init(width: Double) {
        self.width = width
    }
    var width: Double {
        willSet {
            print("willSet方法被调用")
            print("在willSet中,width = \(width),newValue = \(newValue)")
        }
        
        didSet {
            print("didSet方法被调用")
            print("在didSet中,width = \(width),oldValue = \(oldValue)")
        }
    }
}

初始化方法生成对象,并不会触发属性的willSet didSet方法

   // 初始化方法 不会触发 willSet didSet
        let card = TestCard.init(width: 10.0)

改用KVC的方式给对象初始化,就可以调用didSet了:

  • 修改:继承NSObject重新构造函数、属性前加@objc、属性变为必选类型并给默认值。 setValue(width, forKey: "width")
class TestCard: NSObject {
    init(width: Double) {
        super.init()
        setValue(width, forKey: "width")
    }
    @objc var width: Double = 0.0 {
        willSet {
            print("willSet方法被调用")
            print("在willSet中,width = \(width),newValue = \(newValue)")
        }
        
        didSet {
            print("didSet方法被调用")
            print("在didSet中,width = \(width),oldValue = \(oldValue)")
        }
    }
}
图片.png

计算型属性与懒加载

计算型属性:只是为了调用其他属性而包装的读取方法
    //计算型属性:只是为了调用其他属性而包装的读取方法
    var title: String? {
        get {
            return "所选学课:" + "\(name)"
        }
    }
  • 不分配独立的存储空间
  • 每次调用时都会被执行

懒加载

  • 在第一次调用时,执行闭包并且分配空间存储闭包返回的内容
  • 会分配独立的存储空间
  • 与OC不同的是lazy属性即使被设置为nil也不会被再次调用
    lazy var title: String = {
    return "所选学课:" + "(name)"
    }()

相关文章

  • OC的@property与Swift的存储属性/计算属性类比

    Swift中的计算属性/存储属性与OC中的@property   Swift中引入了存储属性、计算属性的概念,存储...

  • Swift进阶(三)--- 属性

    Swift的属性 在swift中,属性主要分为以下几种: 存储属性 计算属性 延迟存储属性 类型属性 一:存储属性...

  • Swift:基础(二十)属性

    Swift 属性 Swift 属性将值跟特定的类、结构或枚举关联。 属性可分为存储属性和计算属性: 存储属性和计算...

  • Swift 属性

    Swift 属性 在Swift中属性主要分为存储属性、计算属性、延迟存储属性、类型属性这四种,并且Swift还提供...

  • Swift属性

    Swift属性分为存储属性,计算属性。或者分为实例属性,类属性。计算属性不存储值(像是一个计算方法),枚举没有存储...

  • 浅谈 Swift 中的属性(Property)

    Properties in Swift 前言 Swift 中的属性分为存储属性与计算属性,存储属性即为我们平时常用...

  • Swift--属性

    Swift属性 存储属性(要么是常量(let 修饰)存储属性,要么是变量(var 修饰)存储属性) 计算属性(顾名...

  • 属性

    Swift 属性将值跟特定的类、结构或枚举关联。属性可分为存储属性和计算属性: 存储属性 计算属性存储常量或变量...

  • Swift 属性

    Swift 属性将值跟特定的类、结构或枚举关联。 属性可分为存储属性和计算属性: 存储属性 计算属性 存储常量或变...

  • swift属性

    swift有三种属性:1、存储属性 2、计算属性 3、类型属性 存储属性//1、存储属性class Perso...

网友评论

      本文标题:Swift 计算属性、存储属性

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