【转载】Swift属性Property

2017-06-12  本文已影响16人  小白猿

本文系转载 原文链接

Swift的属性与Objective-C中的属性是一样的,不同的是Swift细化了属性的类型,另外除了类之外,结构体和枚举也可以有属性。

Swift中有这么几种属性:

另外,我们可以定义属性观察者来监听属性值的改变,以执行一些额外的操作。属性观察者可以添加到自定义的存储属性上,也可以添加到父类继承而来的属性上。

下面我们将详细介绍这些属性

存储属性

存储属性是最简单的属性,它作为类或结构体实例的一部分,用于存储常量和变量。

关于存储属性,有以下几点:

代码清单1

struct FixedLengthRange {
    var firstValue:Int      // 变量存储属性
    let length:Int          // 常量存储属性
}
    
var item1 = FixedLengthRange(firstValue: 10, length: 10)
    
let item2 = FixedLengthRange(firstValue: 10, length: 10)
//item2.firstValue = 6        // 错误:不能修改常量结构体实例的存储属性

计算属性

计算属性并不存储实际的值,而是提供一个getter和一个可选的setter来间接获取和设置其它属性。

关于计算属性,有以下几点:

计算属性的实例如代码清单2:

** 代码清单2 **

struct Point {
    var x = 0.0, y = 0.0
}
    
struct Size {
    var width = 0.0, height = 0.0
}
    
struct Rect {
    var origin = Point()
    var size = Size()
    
    var center:Point {          // 计算属性
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set(newCenter) {            // 若不提供新值变量名,则默认为newValue
            origin.x = newCenter.x - size.width / 2
            origin.y = newCenter.y - size.height / 2
        }
    }
    
    var maxX:Float {        // 只读属性,省略get{}
        return Float(origin.x) + Float(size.width)
    }
}
    
var square = Rect(origin:Point(x: 0.0, y: 0.0), size:Size(width:100, height:100))
    
let initialSquareCenter = square.center
square.center = Point(x: 15.0, y:15.0)
square.maxX

类型属性

类型属性是与类型相关联的,而不是与类型的实例相关联。对于某一类型的所有实例,类型属性都只有一份拷贝。对于值类型,我们可以定义存储类型属性和计算类型属性。对于类,我们只能定义计算类型属性。和实例属性不同的是,我们总是需要给存储类型属性一个默认值。这是因为类型没有初始化方法来初始化类型属性。

类型属性的访问和设置与实例属性一样,不一样的是,类型属性通过类型来获取和设置,而不是类型的实例

** 代码清单3 **

struct AudioChannel {
    static let threaholdLevel = 10
    static var maxInputLevelForAllChannels = 0
    
    var currentLevel:Int = 0 {
        didSet{
            if currentLevel > AudioChannel.threaholdLevel {
                currentLevel = AudioChannel.threaholdLevel
            }
            
            if currentLevel > AudioChannel.maxInputLevelForAllChannels {
                AudioChannel.maxInputLevelForAllChannels = currentLevel
            }
        }
    }
}
    
var leftChannel = AudioChannel()
var rightChannel = AudioChannel()
    
leftChannel.currentLevel = 7
    
println(leftChannel.currentLevel)       // 7
println(AudioChannel.maxInputLevelForAllChannels)   // 7
    
rightChannel.currentLevel = 11
println(rightChannel.currentLevel)      // 10
println(AudioChannel.maxInputLevelForAllChannels)   // 10

属性观察者

属性观察者用于监听和响应属性值的变化。在每次设置属性值的时候都会调用属性观察者方法,即使新旧值是一样的。我们可以为任何存储属性定义属性观察者,除了懒惰存储属性。我们同样可以在子类中给继承而来的属性添加观察者。

对于计算属性,我们不需要定义属性观察者,因为我们可以在计算属性的setter中直接观察并响应这种值的变化。

我们通过设置以下观察方法来定义观察者

willSet与didSet只有在属性第一次被设置时才会调用,在初始化时,不会去调用这些监听方法。

上一篇 下一篇

猜你喜欢

热点阅读