属性 #

一、属性概述 #

属性将值与特定的类、结构体或枚举关联,分为存储属性和计算属性。

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