美文网首页
swift属性

swift属性

作者: FengxinLi | 来源:发表于2016-08-04 14:19 被阅读31次

    属性

    属性将值跟特定的类、结构体和枚举关联。存储属性存储常量或变量作为实例的一部分,而计算属性计算(不是存储)一个值。计算属性可以用于类、结构体和枚举,存储属性只能用于类和结构体。

    存储属性和计算属性通常与特定类型的实例关联。但是属性也可以直接作用于类型本省,这种属性称为类型属性。

    另外,还可以定义属性观察器来监控属性值的变化,以此来触发一个自定义的操作。属性观察器可以添加到自己

    定义的存储属性上,也可以添加到从父类继承的属性上。

    存储属性

    简单来说,一个存储属性就是存储在特定类或结构体的实例里的一个常量或变量。存储属性可以是变量存储属性(用关键字var定义),也可以是常量存储属性(用关键字let定义)

    可以在定义存储属性的时候指定默认值。也可以在构造过程中设置或者修改存储属性的,甚至修改常量存储属性的值。

    常量结构体的存储属性

    如果创建了一个结构体的实例并将其赋值给一个常量,则无法修改该实例的任何属性,即使定义了变量存储属性:

    struct FixedLengthRange {

    var firstValue: Int

    let length: Int

    }

    let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4) // 该区间表示整数0,1,2,3rangeOfFourItems.firstValue = 6// 尽管 firstValue 是个变量属性,这里还是会报错

    因为 rangeOfFourItems 被声明成了常量(用 let 关键字),即使 firstValue 是一个变量属性,也无法再修改它 了。

    这种行为是由于结构体(struct)属于值类型。当值类型的实例被声明为常量的时候,它的所有属性也就成了常 量。

    属于引用类型的类(class)则不一样。把一个引用类型的实例赋给一个常量后,仍然可以修改该实例的变量属 性。

    延迟存储属性

    延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性。在属性声明前使用lazy来标示一个延迟存储属性。

    必须将延迟存储属性声明成变量(使用var关键字),因为属性的初始值可能在实例构造完成之后才会得到。

    而常量属性在构造过程完成之前必须要有初始值,因此无法声明成延迟属性。

    延迟属性很有用,当属性的值依赖于在实例的构造过程结束后才会知道具体值的外部因素时,或者当获得属性的

    初始值需要复杂或大量计算时,可以只在需要的时候计算它。

    存储属性和实例变量

    计算属性

    计算属性不直接存储值,而是提供一个getter和一个可选的setter,来间接获取和设置其他属性或变量的值。

    只读计算属性

    只有getter 没有setter的计算属性就是只读计算属性。只读计算属性总是返回一个值,可以通过点运算符访问,但不能设置新的值。

    必须使用var关键字定义计算属性,包括只读计算属性,因为它们的值不是固定的。let关键字只用来声明常量属性,表示初始化后再也无法修改的值。

    只读计算属性的声明可以去掉get关键字和花括号

    struct Cuboid {

    var width = 0.0, height = 0.0, depth = 0.0

    var volume: Double {

    return width * height * depth

    }

    }

    let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)

    print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)") // 输出 "the volume of fourByFiveByTwo is 40.0"

    属性观察器

    属性观察器监控和响应属性值的变化,每次属性都被设置值得时候都会调用属性棺材器,甚至新的值和现在的值相同的时候也不例外。

    可以为属性添加如下的一个或全部观察器: • 在新的值被设置之前调用

    第 2 章 Swift 教程 | 164

    var

    let

    get

    Cuboid

    volume

    width height depth volume

    Cuboid

    width height depth

    volume

    willSet

    } }

    只读计算属性

    只有 getter 没有 setter 的计算属性就是只读计算属性。只读计算属性总是返回一个值,可以通过点运算符访 问,但不能设置新的值。

    注意:必须使用 关键字定义计算属性,包括只读计算属性,因为它们的值不是固定的。 关键字只用来声明常 量属性,表示初始化后再也无法修改的值。

    只读计算属性的声明可以去掉 关键字和花括号:

    struct Cuboid {

    var width = 0.0, height = 0.0, depth = 0.0

    var volume: Double {

    return width * height * depth

    }}let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0) print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)") // 输出 "the volume of fourByFiveByTwo is 40.0"

    这个例子定义了一个名为 的结构体,表示三维空间的立方体,包含 、 和 属性。结构

    的值毫无意义,因为无法确定修改

    willSet didSet 在新的值被设置之前调用

    • didSet在新的值被设置之后立即调用

    willSet 观察器会将新的属性值作为常量参数传入,在 willSet 的实现代码中可以为这个参数指定一个名称,如 果不指定则参数仍然可用,这时使用默认名称 newValue 表示。

    类似地, didSet 观察器会将旧的属性值作为参数传入,可以为该参数命名或者使用默认参数名 oldValue 。

    相关文章

      网友评论

          本文标题:swift属性

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