Swift学习笔记系列——(9)属性

Tags: Swift 学习笔记

发布时间:2015-07-17
修改时间:2015-07-17
作者:Erwin
博客地址:技术杂货铺
欢迎转载,转载请注明出处。

Swift学习笔记系列——(9)属性

属性关联数据到特定的结构体、或者枚举

存储属性

存储属性可以是常量,也可以是变量。
可以给存储属性提供默认值。初始化的时候可以设置和修改存储属性的值,对于常量存储属性也适用。

常量结构体实例的存储属性

结构体实例被赋值给一个常量,即使该结构体的属性被声明为变量,也不能对其属性进行修改。
这从侧面证明了结构体是值类型的,同样的情形不会出现在类上。

惰性存储属性

用lazy关键字标记。
第一次被使用时才会被初始化的属性。
多线程一起访问一个未初始化的惰性存储属性时,不能保证该属性只被初始化一次。

存储属性和实例变量

OC中可以用属性和实例变量存储数据。
不同于OC,Swift将二者同一起来。

计算属性

除了存储属性,类、结构体和枚举可以定义计算属性,计算属性并不存储值,而是提供了getter和可选的setter来间接地获取或设置其他属性或者值。
计算属性必须是变量
setter可以省略,属性变为只读

计算属性写法

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)
    }
}

计算属性简写

setter有默认参数newValue,可以省去不写

 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)
        }
    }

属性观察者

属性观察者观察和响应一个属性的值的改变。
即使是赋予的新值和原来的值相同,照样可以触发观察者的行为。
初始化赋值时不会触发观察者的行为。
didSet观察者中修改属性值,不会触发观察者行为。
自己定义的任意存储属性(惰性存储属性除外)都可以加观察者。
继承来的属性不论是存储属性还是计算属性都可以添加观察者。
没有必要给非继承的计算属性添加观察者,因为一切皆在你掌握。

两种观察者可以随意选用

willSet 在值被存储前调用;
didSet 在值被存储后被调用。
willSet的默认参数:newValue,表示新赋予的值。
didSet 的默认参数:oldValue,表示原来的值。

观察者写法

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

全局和本地变量

全局变量是不定义在任何函数、方法、闭包或者类型中的变量。
本地变量是定义在函数、方法或者闭包中的变量。
全局和本地变量也可以有计算属性和属性观察者的功能。
全局常量和变量通常都是惰性计算的,而且不需要声明为lazy。
本地变量和常量都不能惰性计算。

类型属性

类型属性在其他语言叫做静态属性。存储的类型属性可以是常量也可以是变量,但是必须给出初始值,因为类型属性没有机会初始化。

类型属性的语法

可以用static关键字定义类型属性。对于类类型的计算属性,如果要允许子类复写超类实现,需要用class关键字将其定义为类型属性。

struct SomeStructure {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 1
    }
}
enum SomeEnumeration {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 6
    }
}
class SomeClass {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 27
    }
    class var overrideableComputedTypeProperty: Int {
        return 107
    }
}

这里没有可读写的计算属性例子,以后要加上。

使用和设置类型属性

用“类型名.属性名”访问和设置类型属性

本章思维导图

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值