持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
- Swift Optional
- Swift Enum
- iOS开发 做一个三角形
- Swfit 指针类型
- Swift 属性(下)
- Swift 属性
- Swift 小结
- Swift 类与结构体(下)
- Swift 类的生命周期
- Swift 类的初始化器
- Swift 类与结构体
- OpenGL 压缩纹理
- OpenGL 隧道坐标计算
- 0penGL 像素格式及数据类型
- OpenGL 纹理对象
- OpenGL 纹理
- OpenGL 模型变化
- OpenGL 视图
- OpenGL 矩阵
- OpenGL 向量
- OpenGL 颜色混合
- OpenGL 深度测试的潜在风险
- OpenGL 浅析深度测试
- OpenGL 浅析隐藏面消除
- OpenGL 图元连接方式
- 记WKWebView与HTML完成交互两三事
- OpenGL 渲染流程图解析
- OpenGL 控制你的正方形
- OpenGL 专业名词解释
- 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
}
}