属性 #
一、属性概述 #
属性将值与特定的类、结构体或枚举关联,分为存储属性和计算属性。
1.1 属性类型 #
- 存储属性:存储常量或变量值
- 计算属性:计算值
- 类型属性:与类型本身关联
二、存储属性 #
2.1 基本用法 #
swift
struct Person {
var name: String
let birthYear: Int
}
var person = Person(name: "张三", birthYear: 2000)
person.name = "李四"
print(person.name)
2.2 常量存储属性 #
swift
struct Person {
let id: Int
var name: String
}
var person = Person(id: 1, name: "张三")
person.name = "李四"
2.3 延迟存储属性 #
swift
class DataManager {
lazy var data: [String] = {
print("加载数据")
return ["A", "B", "C"]
}()
init() {
print("DataManager初始化")
}
}
let manager = DataManager()
print("创建完成")
print(manager.data)
三、计算属性 #
3.1 基本用法 #
swift
struct Rectangle {
var width: Double
var height: Double
var area: Double {
return width * height
}
var perimeter: Double {
return 2 * (width + height)
}
}
let rect = Rectangle(width: 10, height: 5)
print("面积: \(rect.area)")
print("周长: \(rect.perimeter)")
3.2 可写计算属性 #
swift
struct Circle {
var radius: Double
var diameter: Double {
get {
return radius * 2
}
set {
radius = newValue / 2
}
}
}
var circle = Circle(radius: 5)
print("直径: \(circle.diameter)")
circle.diameter = 20
print("半径: \(circle.radius)")
3.3 只读计算属性 #
swift
struct Cube {
var side: Double
var volume: Double {
return side * side * side
}
}
let cube = Cube(side: 3)
print("体积: \(cube.volume)")
3.4 简化语法 #
swift
struct Point {
var x: Double
var y: Double
var description: String {
return "(\(x), \(y))"
}
}
四、属性观察器 #
4.1 willSet和didSet #
swift
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("即将从\(totalSteps)变为\(newTotalSteps)")
}
didSet {
print("从\(oldValue)变为\(totalSteps)")
}
}
}
let counter = StepCounter()
counter.totalSteps = 100
counter.totalSteps = 200
4.2 实际应用 #
swift
class Temperature {
var celsius: Double = 0 {
didSet {
if celsius > 100 {
print("警告:温度超过沸点!")
}
}
}
var fahrenheit: Double {
return celsius * 9 / 5 + 32
}
}
let temp = Temperature()
temp.celsius = 50
temp.celsius = 120
4.3 属性观察器与继承 #
swift
class BaseClass {
var value: Int = 0 {
willSet {
print("Base willSet")
}
didSet {
print("Base didSet")
}
}
}
class DerivedClass: BaseClass {
override var value: Int {
willSet {
print("Derived willSet")
}
didSet {
print("Derived didSet")
}
}
}
五、类型属性 #
5.1 静态属性 #
swift
struct MathUtility {
static let pi = 3.14159
static func square(_ x: Double) -> Double {
return x * x
}
}
print(MathUtility.pi)
print(MathUtility.square(5))
5.2 类属性 #
swift
class Counter {
static var totalCount = 0
class var description: String {
return "Counter类"
}
init() {
Counter.totalCount += 1
}
}
let counter1 = Counter()
let counter2 = Counter()
print("创建了\(Counter.totalCount)个实例")
print(Counter.description)
5.3 单例模式 #
swift
class Singleton {
static let shared = Singleton()
private init() {}
func doSomething() {
print("执行操作")
}
}
Singleton.shared.doSomething()
六、属性包装器 #
6.1 基本用法 #
swift
@propertyWrapper
struct TwelveOrLess {
private var number = 0
var wrappedValue: Int {
get { return number }
set { number = min(newValue, 12) }
}
}
struct SmallRectangle {
@TwelveOrLess var height: Int
@TwelveOrLess var width: Int
}
var rectangle = SmallRectangle()
rectangle.height = 10
rectangle.width = 24
print(rectangle.height)
print(rectangle.width)
6.2 带初始值 #
swift
@propertyWrapper
struct Clamped<T: Comparable> {
var wrappedValue: T
let range: ClosedRange<T>
init(wrappedValue: T, _ range: ClosedRange<T>) {
self.wrappedValue = min(max(wrappedValue, range.lowerBound), range.upperBound)
self.range = range
}
}
struct Size {
@Clamped(0...100) var width: Int = 50
@Clamped(0...100) var height: Int = 50
}
var size = Size()
size.width = 150
print(size.width)
七、实际应用 #
7.1 数据验证 #
swift
class User {
private var _age: Int = 0
var age: Int {
get { return _age }
set {
guard newValue >= 0 && newValue <= 150 else {
print("年龄无效")
return
}
_age = newValue
}
}
}
let user = User()
user.age = 25
user.age = -5
7.2 缓存属性 #
swift
class ImageLoader {
var imageUrl: String? {
didSet {
cachedImage = nil
}
}
private var cachedImage: UIImage?
var image: UIImage? {
if let cached = cachedImage {
return cached
}
guard let url = imageUrl else { return nil }
let loaded = loadImage(from: url)
cachedImage = loaded
return loaded
}
private func loadImage(from url: String) -> UIImage? {
return UIImage()
}
}
7.3 派生属性 #
swift
struct Product {
var price: Double
var quantity: Int
var subtotal: Double {
return price * Double(quantity)
}
var tax: Double {
return subtotal * 0.1
}
var total: Double {
return subtotal + tax
}
}
let product = Product(price: 100, quantity: 3)
print("小计: \(product.subtotal)")
print("税费: \(product.tax)")
print("总计: \(product.total)")
八、总结 #
本章学习了Swift属性:
- 存储属性:存储值
- 计算属性:计算值
- 属性观察器:监控变化
- 类型属性:与类型关联
最佳实践:
- 合理使用计算属性
- 使用属性观察器响应变化
- 延迟加载耗时资源
- 使用属性包装器复用逻辑
下一章,我们将学习方法!
最后更新:2026-03-26