您的位置:首页 > 移动开发 > Swift

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

2015-07-17 16:32 225 查看
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
}
}


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

使用和设置类型属性

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

本章思维导图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: