Swift 属性

240 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情


  1. Swift Optional
  2. Swift Enum
  3. iOS开发 做一个三角形
  4. Swfit 指针类型
  5. Swift 属性(下)
  6. Swift 属性
  7. Swift 小结
  8. Swift 类与结构体(下)
  9. Swift 类的生命周期
  10. Swift 类的初始化器
  11. Swift 类与结构体
  12. OpenGL 压缩纹理
  13. OpenGL 隧道坐标计算
  14. 0penGL 像素格式及数据类型
  15. OpenGL 纹理对象
  16. OpenGL 纹理
  17. OpenGL 模型变化
  18. OpenGL 视图
  19. OpenGL 矩阵
  20. OpenGL 向量
  21. OpenGL 颜色混合
  22. OpenGL 深度测试的潜在风险
  23. OpenGL 浅析深度测试
  24. OpenGL 浅析隐藏面消除
  25. OpenGL 图元连接方式
  26. 记WKWebView与HTML完成交互两三事
  27. OpenGL 渲染流程图解析
  28. OpenGL 控制你的正方形
  29. OpenGL 专业名词解释
  30. OpenGL 环境搭建 - MacOS

上一篇,我们对Swift进行了一个小结, 今天,我们继续Swift的脚步,来看下Swift的属性内容。

存储属性

存储属性是一个作为特定类和结构体实例一部分的常量或变量。存储属性要么是变量存储属性 (由 var 关键字引入)要么是常量存储属性(由 let 关键字引入)。存储属性这里没有什么特 别要强调的,因为随处可⻅

class LGTeacher {
  var age: Int
  var name: String 
}

比如这里的 age 和 name 就是我们所说的存储属性,这里我们需要加以区分的是 let 和 var 两者的区别:从定义上: let 用来声明常量,常量的值一旦设置好便不能再被更改; var 用来声明变量,变量的值可以在将来设置为不同的值。

这里我们来看几个案例:

class LGTeacher{ 
    
    let age: Int
    var name: String
    init(_ age: Int, _ name: String){

        self.age = age
        self.name = name 
    }
}

struct LGStudent {
    let age: Int
    var name: String 
}

let t = LGTeacher(age: 18, name: "Hello") 
t.age = 20
t.name = "Logic"
t = LGTeacher(age: 30, name: "Kody")

var t1 = LGTeacher(age: 18, name: "Hello") 
t.age = 20
t.name = "Logic"
t = LGTeacher(age: 30, name: "Kody")

let s = LGStudent() 
s.age = 25
s.name = "Doman"
s = LGStudent()

var s1 = LGStudent() 
s.age = 25
s.name = "Doman"
s = LGStudent()

let 和 var 的区别:

  • 从汇编的⻆度
  • 从 SIL的⻆度

计算属性

存储的属性是最常⻅的,除了存储属性,类、结构体和枚举也能够定义计算属性,计算属性并不 存储值,他们提供 getter 和 setter 来修改和获取值。对于存储属性来说可以是常量或变量,但计算属性必须定义为变量。于此同时我们书写计算属性时候必须包含类型,因为编译器需 要知道期望返回值是什么。

struct square{
    var width: Double
    var area: Double{
        get{
            return width * hegith 
        }
        set{
            self.width = newValue
        } 
    }
}

属性观察者

属性观察者会观察用来观察属性值的变化,一个 willSet 当属性将被改变调用,即使这个值与 原有的值相同,而 didSet 在属性已经改变之后调用。它们的语法类似于 getter 和 setter。

class SubjectName{
    var subjectName: String = ""{
        willSet{
            print("subjectName will set value \(newValue)")
        } didSet {
            print("subjectName has been changed \(oldValue)") 
        }
    } 
}

这里我们在使用属性观察器的时候,需要注意的一点是在初始化期间设置属性时不会调用 willSet 和 didSet 观察者;只有在为完全初始化的实例分配新值时才会调用它们。运行下面这段代码,你会发现当前并不会有任何的输出。

class SubjectName{
    var subjectName: String = "[unnamed]"{    
        willSet{
            print("subjectName will set value \(newValue)")
        } didSet{
            print("subjectName has been changed \(oldValue)") 
        }
    }
    init(subjectName: String) { self.subjectName = subjectName
    }
}
let s = SubjectName(subjectName: "Swift进阶")

上面的属性观察者只是对存储属性起作用,如果我们想对计算属性起作用怎么办?很简单,只需 将相关代码添加到属性的 setter。我们先来看这段代码

class Square{
    var width: Double
    var area: Double{ 
        get{
            return width * width 
        }
        set {
            self.width = sqrt(newValue)
        } willSet{
            print("area will set value \(newValue)") }
        didSet{
            print("area has been changed \(oldValue)")
        } 
    }
init(width: Double) {
    self.width = width
    }
}