Swift 中的属性

作者: 乐人曹 | 来源:发表于2014-08-20 21:58 被阅读0次

存储属性

作为实例一部分的常量或变量。
可以提供一个默认值,或者在初始化过程中设置(或修改)属性的值,对常量的存储属性也适用。

struct FixedLengthRange {
    var firstValue: Int
    let length: Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
// the range represents integer values 0, 1, and 2
rangeOfThreeItems.firstValue = 6
// the range now represents integer values 6, 7, and 8

存储属性变量还可以是惰性的(用 lazy 关键字表征)。
存储属性常量是不可以的,因为常量必须在初始化完成之前有值,而惰性求值可能发生在初始化完成之后。

计算属性

计算属性并不真的存储一个值。TA们提供一个 getter 和可选的 setter 间接获取和设置其他属性。

计算属性必须使用 var 关键字定义。因为计算属性的值不是固定的,会根据计算而改变。
let 关键字只用于常量属性,来表征TA们的值在实例实例化之后不会再改变)

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) {
            origin.x = newCenter.x - (size.width / 2)
            origin.y = newCenter.y - (size.height / 2)
        }
    }
}

// newValue is used if a name for the new value is not set.
struct AlternativeRect {
    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 {
            origin.x = newValue.x - (size.width / 2)
            origin.y = newValue.y - (size.height / 2)
        }
    }
}

去除 setter,计算属性就变成只读的。

struct Cuboid {
    var width = 0.0, height = 0.0, depth = 0.0
    var volume: Double {
        return width * height * depth
    }
}

属性观察器

使用 willSet didSet

可以给存储属性(惰性的除外)提供观察器,或者是任何被重写的继承而来的属性(无论是存储属性还是计算属性)。
无需给非重写的计算属性提供观察器,因为可以直接在 setter 中对值改变做出反应。

属性初始化时,观察器不会被调用。

使用 willSet,新的值(自己定义一个名字,或者默认使用newValue)会作为常量参数传递。
使用 DidSet,旧的值(自己定义一个名字,或者默认使用oldValue)会作为常量参数传递。

class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            println("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                println("Added \(totalSteps - oldValue) steps")
            }
        }
    }
}

属性与全局和局部变量

目前为止,遇到的变量(无论全局还是局部)都是存储变量,和存储属性类似。
然而,也可以定义计算变量,或者为存储变量提供观察器。

不过,要注意,全局的常量和变量总是惰性求值的(无需用 lazy 表征),而局部的常量和变量绝不会惰性求值。

类属性

为类本身定义属性,

  1. 所有实例都可以使用的常量属性(static constant in C),
  2. 所有实例都可见的变量属性(static variable in C)。

对于值类型,存储属性和计算属性都可以定义,使用 static 关键字。
对于引用类型,只可以定义计算属性,使用 class 关键字。

对于存储属性,必须为其提供默认值,毕竟,类型本身没有初始化过程...

struct SomeStructure {
    static var storedTypeProperty = "Some value."
    static let storedConstantTypeProperty = "Some value"
    static var computedTypeProperty: Int {
        // return an Int value here
    }
}
enum SomeEnumeration {
    static var storedTypeProperty = "Some value."
    static let storedConstantTypeProperty = "Some value"
    static var computedTypeProperty: Int {
        // return an Int value here
    }
}
class SomeClass {
    class var computedTypeProperty: Int {
        // return an Int value here
    }
}

相关文章

  • OC的@property与Swift的存储属性/计算属性类比

    Swift中的计算属性/存储属性与OC中的@property   Swift中引入了存储属性、计算属性的概念,存储...

  • Swift 属性

    Swift 属性 在Swift中属性主要分为存储属性、计算属性、延迟存储属性、类型属性这四种,并且Swift还提供...

  • Swift进阶(三)--- 属性

    Swift的属性 在swift中,属性主要分为以下几种: 存储属性 计算属性 延迟存储属性 类型属性 一:存储属性...

  • 浅谈 Swift 中的属性(Property)

    Properties in Swift 前言 Swift 中的属性分为存储属性与计算属性,存储属性即为我们平时常用...

  • 第10章:属性

      在Swift中枚举、结构体、类都可以有属性,属性描述了类型的某个特性。在Swift中属性从大的方面分可以分为存...

  • Swift学习-进阶02

    swift对象本质,一个swift的对象默认占用16字节大小,在内存中的结构: swift类结构: 属性 存储属性...

  • Swift 计算属性、存储属性

    属性 Swift中的属性分为存储属性(sorted variable)和计算型属性(computed variab...

  • Swift中的属性

    1. 存储属性 简单来说,每一个存储属性就是存储在特定类或结构体实例里的一个常量或变量。存储属性可以使变量存储属性...

  • Swift中的属性

      我们都知道,类是由属性和方法组成的,一般而言,属性主要是用来访问数据成员,而方法则是用来执行某些操作,比如说计...

  • swift中的属性

    属性可以将值与特定的类、结构体或者是枚举联系起来。 一、简介 存储属性与计算属性的差异: 存储属性会存储敞亮或者变...

网友评论

    本文标题:Swift 中的属性

    本文链接:https://www.haomeiwen.com/subject/ayoetttx.html