Swift 属性


Swift 属性

在Swift中,属性是特定类、结构体或枚举值的值或状态。它们可以是计算属性,该属性值是通过计算得出的,或者是存储属性,该属性值是分配给属性的值。

存储属性

定义存储属性

存储属性是存储在特定类或结构体实例中的常量或变量。可以将其定义为变量属性(用变量关键字var定义),也可以定义为常量属性(用常量关键字let定义)。定义语法如下:

//定义变量属性
var variableProperty: Int

//定义常量属性
let constantProperty: Int

在定义存储属性时,必须给它们一个类型,以指定这个属性可以存储的值的类型。

存储属性的默认值

在Swift中,存储属性可以设置默认值。在创建实例的时候,属性会被初始化为它们的默认值。定义语法如下:

class SomeClass {
    var variableProperty = 0
    let constantProperty = "constant"
}

上述代码中,变量属性variableProperty的默认值为0,常量属性constantProperty的默认值为字符串"constant"。

计算属性

计算属性是不直接存储值的属性。相反,它们提供了一个getter函数和一个可选的setter函数来获取和设置其他属性和值。

定义计算属性

计算属性可以与存储属性一样使用var或let关键字来定义。只需将变量或常量关键字放在计算属性的定义前即可。定义语法如下:

var computedProperty: Int {
    get {
        //计算并返回该属性的值
    }
    set(newValue) {
        //执行赋值操作,也可以省略
    }
}

在上述代码中,计算属性computedProperty有getter函数和setter函数。getter函数与存储属性不同,它们不需要参数,并返回属性的值。setter函数需要一个newValue参数来传递新的属性值。很少使用计算属性的setter函数,通常只用getter函数来计算属性的值。

只读计算属性

如果只需要一个getter函数来计算属性的值,则可以将计算属性定义为只读属性。只读属性只有getter函数,没有setter函数。定义语法如下:

var computedProperty: Int {
    get {
        //计算并返回该属性的值
    }
}

在上述代码中,计算属性computedProperty只有getter函数。它的值是在设法被计算出来的,而不能为该属性赋新值。

属性观察器

属性观察器是一种监视属性值变化的方式。它们可以在属性值将要被设置时(didSet)或属性值已经被设置时(willSet),执行自定义的代码。

定义属性观察器

使用willSet和didSet来定义属性观察器。willSet在属性值将要被设置时被调用,didSet在属性值已经被设置时被调用。定义语法如下:

class SomeClass {
    var variableProperty: Int = 0 {
        willSet(newVariableProperty) {
            //执行将要设置属性值时的代码
        }
        didSet {
            //执行已经设置属性值时的代码
        }
    }
}

在上述代码中,属性variableProperty具有willSet和didSet属性观察器。将属性值设置为新值时,willSet被调用并将新值作为参数传递。设置属性的值之后,didSet被调用,并将旧值作为参数传递。

类属性 和 实例属性

在Swift中,如果需要在整个类中共享一个属性,则可以使用类属性。如果属性值是在每个实例中独立存储的,则可以使用实例属性。

类属性用关键字static或class定义,而不是使用var或let。使用static定义的属性是静态的,无法被继承或覆盖。使用class定义的属性是动态的,可以被继承或覆盖。

class SomeClass {
    static var classProperty: Int = 0
    var instanceProperty: Int = 0
}

在上述代码中,类SomeClass具有一个名为classProperty的类属性,它的值在整个类中共享。另外,实例属性instanceProperty独立存储在每个实例中。

总结

在Swift中,属性是特定类、结构体或枚举值的值或状态。它们可以是计算属性,该属性值是通过计算得出的,或者是存储属性,该属性值是分配给属性的值。计算属性和存储属性都可以在属性值设置前后加入代码。此外,还可以使用类属性和实例属性来定义与类或实例相关的属性。