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