Swift学习笔记(10)—— 属性

10.属性

存储属性

就是一般的正常属性了,用var或者let定义。

常量和存储属性

如果把结构体的实例赋值给一个常量,则实例的属性不能再修改了;但如果是一个类的实例赋值给一个常量,实例的变量属性依然可以修改——因为结构体是值类型,类是引用类型。

延迟存储属性

使用@lazy标识一个延迟存储属性。
延迟属性在第一次调用的时候才会被初始化——目测适用于一些初始化比较耗时的属性。
因为常量属性在构造过程完成之前必须要有初始值,所以常量属性无法被标识为延迟属性。

计算属性

就是非直接的属性,而是计算出来的属性——比如一个圆的半径是一个存储属性,而周长是可以用半径计算出来的,则就可以将周长声明为一个计算属性,这样当改变半径的时候,周长也会跟着自动改变,也可以通过方法在设置周长的时候自动调整属性。

一般形式:一个getter,一个可选的setter

struct Circle {
    var radius : Double = 1 //半径
    var length :Double { //周长
    get{
        return 3.14 * 2 * radius
    }
    set(newLength){
        radius = newLength / (3.14 * 2)
    }
    }
}

var c = Circle()
println(c.length)  // 输出6.28  (调用get)
c.length = 12.56    // (调用set,会改变radius的值)
println(c.radius)   // 输出2.0

TIP: getter是必须的,setter是可选的

便捷setter声明

可以省略setter的参数名,这样可以在setter内部默认使用newValue作为参数名。
上面的set可以简写成这样:

set{
    radius = newValue / (3.14 * 2)
}

只读计算属性

只写getter不写setter就行了……
只读属性可以省略get关键字和花括号。

struct Circle {
    var radius : Double = 1 //半径
    var length :Double { //周长
        return 3.14 * 2 * radius
    }
}

属性监视器

可以为属性添加如下的一个或全部监视器:

  • willSet在设置新的值之前调用
    传入新的属性值作为参数。
    可以省略参数名,默认使用newValue
  • didSet在新的值被设置之后立即调用
    传入旧的属性值作为参数。
    可以省略参数名,默认使用oldValue

    struct Circle {
        var radius : Double = 1{//半径
        willSet(newValue){
            println("radius将要设置成\(newValue)")
        }
        didSet{
            println("radius已经重新设定,旧的值是\(oldValue),新的值是\(radius)")
        }
    
    }
    var c = Circle()
    c.radius = 20
    
    //输出结果:
    //  radius将要设置成20.0
    //  radius已经重新设定,旧的值是1.0,新的值是20.0
    

全部变量和局部变量

全部属性都是延迟属性,即都会在调用的时候才进行初始化,而且不需要@lazy关键字。

类型属性

可以直接用类型名(结构体名、类名等)调用的属性——目测就是JAVA的静态属性。
声明时加上static关键字即可。



这笔记只是给我自己看的,用以标记一些我觉得需要记的或者有意思的一些知识点,有很多我觉得没必须要赘述的东西就没记,所以是不系统的,只作提示用。
感谢 numbbbbb以及其他贡献者: https://github.com/numbbbbb/the-swift-programming-language-in-chinese
当然,还有英文页: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html#//apple_ref/doc/uid/TP40014097-CH6-XID_70


http://www.barryzhang.com/archives/260

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*