📜  Swift属性(1)

📅  最后修改于: 2023-12-03 14:47:48.236000             🧑  作者: Mango

Swift属性

在 Swift 语言中,属性是一种常见的声明机制,用于为类、结构体和枚举添加特定的值。这些值可以被其他对象读取和修改。属性既可以是实例属性(Instance Property),也可以是类型属性(Type Property),还可以是存储属性(Stored Property)或计算属性(Computed Property)。

存储属性

存储属性是指保存在特定类或结构体的实例中的常量或变量。存储属性可以是变量(var)或常量(let)。它们必须在声明时被初始化,或者在构造器中初始化。下面是一个示例:

struct Rectangle {
    var width: Int
    var height: Int
}

var rectangle = Rectangle(width: 10, height: 20)
print(rectangle.width) // 输出 10

上面的代码中,我们定义了一个 Rectangle 结构体,它有两个存储属性 widthheight。我们创建一个 Rectangle 实例并给它赋初值,然后访问它的 width 属性,输出 10。

计算属性

计算属性是指通过某种计算方法得到的值。它们不存储实际的值,而是提供 getter 和 setter 方法来获取和设置值。计算属性必须用 var 关键字声明,因为它们的值可以在获取时改变。下面是一个示例:

struct Circle {
    var radius: Double
    
    var diameter: Double {
        get {
            return radius * 2
        }
        set {
            radius = newValue / 2
        }
    }
}

var circle = Circle(radius: 10)
print(circle.diameter) // 输出 20

circle.diameter = 40
print(circle.radius) // 输出 20

上面的代码中,我们定义了一个 Circle 结构体,它有一个存储属性 radius 和一个计算属性 diameter。计算属性的 get 方法返回 radius 的两倍,set 方法将传入的值除以二并赋给 radius。我们创建一个 Circle 实例并访问它的 diameter 属性,输出 20。然后我们给它的 diameter 属性赋值为 40,由于 diameter 是计算属性,它的 set 方法会被调用,并设置了 radius 的新值为 20。我们再次访问 radius 属性,输出 20。

类型属性

类型属性是指为类型本身定义的属性,而不是类型的实例属性。它可以用于存储类型的常量或变量,也可以用于定义类型的计算属性。类型属性必须用 static 关键字声明,或者用 class 关键字声明如果它是一个类的计算属性,并需要子类可以重写它的 getter 和 setter 方法。下面是一个示例:

struct Car {
    static let maxSpeed = 200
    
    static var count = 0
    
    var speed: Int
    
    static var avgSpeed: Double {
        return Double(count) / Double(maxSpeed)
    }
    
    init(speed: Int) {
        self.speed = speed
        Car.count += 1
    }
}

var car1 = Car(speed: 100)
var car2 = Car(speed: 150)

print(Car.maxSpeed) // 输出 200
print(Car.count) // 输出 2
print(Car.avgSpeed) // 输出 0.01

上面的代码中,我们定义了一个 Car 结构体,它有一个存储属性 maxSpeed 和一个类型属性 count,还有一个计算属性 avgSpeed。我们创建两个 Car 实例并访问它们的属性,再访问 Car 类型的属性和计算属性,输出相应的结果。示例代码返回 200,2 和 0.01。

属性观察器

属性观察器是指在属性值发生变化前和变化后执行的代码块。属性观察器可以在存储属性和子类重写的计算属性中使用。它们使用 willSetdidSet 两个方法来观察属性值的变化。下面是一个示例:

struct Temperature {
    var celsius: Double {
        didSet {
            if celsius > 100 {
                print("Warning: Boiling")
            } else if celsius < 0 {
                print("Warning: Freezing")
            }
        }
    }
}

var temperature = Temperature(celsius: 37)
temperature.celsius = 50 // 不输出任何内容
temperature.celsius = 101 // 输出 "Warning: Boiling"

上面的代码中,我们定义了一个 Temperature 结构体,它有一个计算属性 celsius。在属性的 didSet 方法中,我们检查温度是否过高或过低,并发送相应的警告。我们创建一个 Temperature 实例并将其赋值为 37,然后分别将它的 celsius 属性设置为 50 和 101。第一个赋值不输出任何内容,第二个赋值输出 "Warning: Boiling"。

总结

Swift 的属性机制为程序员提供了丰富的功能来存储和操作数据。存储属性、计算属性、类型属性和属性观察器的不同类型使得属性在多种情况下都可以使用。这些属性可以让我们更轻松地定义和修改数据,使我们的代码更加具有可读性和重用性。