Swift入门必知:属性详解(第18篇)
最编程
2024-02-04 16:48:31
...
属性可分为存储属性和计算属性
18.1 存储属性
存储属性是存储在特定类或结构体的实例里的一个常量或变量,可以在定义存储属性的时候指定默认值,也可以在构造过程中设置或修改存储属性的值
import Cocoa
struct Number {
var digits: Int
let pi = 3.14 // 定义存储属性的时候指定默认值
}
var n = Number(digits: 123) // 构造过程中设置存储属性的值
n.digits = 1234 // 不会报错,构造过程中修改存储属性的值
// n.pi = 3.141 // 会报错,因为pi是常量
print(n.digits) // 1234
print(n.pi) // 3.14
18.2 延迟存储属性
延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性,必须将延迟存储属性声明为变量(var关键词),因为常量属性在构造完成之前必须要有初始值。延迟存储属性常用于延时对象的创建、属性的值依赖于其他未知类。
import Cocoa
class Sample {
lazy var no = Number() // lazy定义延迟存储属性,且该属性为var
}
class Number {
var name = "world"
}
var firstSample = Sample()
print(firstSample.no.name)
18.3 计算属性
计算属性不直接存储值,而是提供一个get来获取值,一个可选的set来设置其他属性或变量的值
import Cocoa
class Sample {
var no1 = 0.0, no2 = 0.0
var length = 300.0, breadth = 150.0
var middle: (Double, Double) {
get { return (length / 2, breadth / 2) }
set(axis) {
no1 = axis.0 - (length / 2)
no2 = axis.1 - (breadth / 2)
}
}
}
var result = Sample()
print(result.middle)
result.middle = (0.0, 10.0) // (150.0, 75.0)
print(result.no1) // -150.0
print(result.no2) // -65.0
18.4 只读计算属性
只有get没有set的计算属性为只读计算属性
import Cocoa
class Film {
var head = ""
var duration = 0.0
var metaInfo: [String: String] {
return [
"head": self.head,
"duration": "\(self.duration)"
]
}
}
var move = Film()
move.head = "Swift 属性"
move.duration = 3.09
print(move.metaInfo["head"]!) // Swift 属性
print(move.metaInfo["duration"]!) // 3.09
18.5 属性观察器
属性观察器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性观察器。可以为除了延迟存储属性之外的其他存储属性添加属性观察器,也可以通过重载属性的方式为继承的属性添加属性观察器。不需要为无法重载的计算属性添加属性观察器,因为可以通过set直接监控和响应值的变化。(用willSet和didiSet实现属性观察器)
import Cocoa
class Sample {
var counter: Int = 0 {
// 先执行willSet,再执行didSet
willSet(newTotal) { print("计数器:\(newTotal)") }
didSet {
if counter > oldValue { print("新增数:\(counter - oldValue)") } // oldValue为counter的旧值
}
}
}
let newCounter = Sample()
newCounter.counter = 100
newCounter.counter = 800
// 结果为:
// 计数器:100
// 新增数:100
// 计数器:800
// 新增数:700
18.6 类型属性
和实例属性区分开,类型属性是类型定义的一部分写在类型最外层的花括号里,使用关键字static定义值类型的类型属性,class定义类类型的类型属性
import Cocoa
struct StudMarks {
static let markCount = 97
static var totalCount = 0
var InternalMarks: Int = 0 {
didSet {
if InternalMarks > StudMarks.markCount {
InternalMarks = StudMarks.markCount
}
if InternalMarks > StudMarks.totalCount {
StudMarks.totalCount = InternalMarks
}
}
}
}
var stud1Mark1 = StudMarks()
var stud1Mark2 = StudMarks()
stud1Mark1.InternalMarks = 98
print(StudMarks.totalCount) // 获取类型属性
stud1Mark2.InternalMarks = 87
print(StudMarks.totalCount) // 获取类型属性
推荐阅读