swift中属性分为静态属性和存储属性,存储属性类似于OC中的数据成员,计算属性不存储数据
存储属性
存储属性适用于类、结构体(枚举只有静态存储属性)
- 延时存储属性
俗称:懒加载,只有在首次调用的时候才初始化。
struct structOne {
let name: String = "zhangsan"
}
class classOne {
lazy var paramary: structOne = structOne()
}
- 计算属性
计算属性本身并不存储数据,他通过计算返回数据。类、结构体、枚举都可以定义计算属性
计算属性必须使用var修饰,语法结构如下:
面向对象类型 类型名 {
var 计算属性名: 就算属性类型 {
get {
return 计算后属性值
}
set(新属性值) { //默认newValue
}
}
}
只读计算属性 (省略setter访问器,省略get{}代码)。语法如下:
var fullName: String {
return “sun” + “tao”
}
- 属性观察者
属性观察者能够监听存储属性的变化,不能监听延迟存储属性和常量存储属性的变化
wiiSet: 观察者在修改之前调用
didSet:观察者在修改之后调用
语法结构
面向对象类型 类型名 {
var 存储属性:数据类型 = 初始化值 {
willSet(新值) {
…
}
didSet(旧值) {
…
}
}
}
- 静态属性
3种面向对象类型(类、结构体、枚举)都可以定义静态属性,它们的语法结构分别如下:
注意:在静态计算属性中不能访问实例属性(包括存储属性和计算属性),但是可以访问其他静态属性。在实例计算属性中能访问实例属性,也能访问静态属性。
struct 结构体名 {
static var(或let) 存储属性 = "xxx"
static var 计算属性名:属性数据类型 {
get {
return 计算后的值
}
set(新属性值) {
...
}
}
}
枚举中不可以定义实例存储属性,但可以定义静态存储属性和静态计算属性
enum 枚举名 {
static var (或let) 存储属性 = "xxx"
static var 计算属性名: String {
get {
return "计算后的值"
}
set(新属性值) {
}
}
}
类静态计算属性如果使用static定义,该属性不能再子类中重写(override),使用class可以在子类重写
class 类名 {
static var(或let) 存储属性 = "xxx"
static(或class) var 计算属性名: String {
get {
return "计算后的值"
}
set(新属性值) {
}
}
}
总结如下:
类型 | 实例存储属性 | 静态存储属性 | 实例计算属性 | 静态计算属性 |
---|---|---|---|---|
类 | 支持 | 支持 | 支持 | 支持 |
结构体 | 支持 | 支持 | 支持 | 支持 |
枚举 | 不支持 | 支持 | 支持 | 支持 |
下标
我们可以通过下标访问一些集合类型中的元素,它的语法结构如下:
面向对象类型 类型名 {
其他属性
...
subscript(参数:参数数据类型) -> 返回值数据类型 {
get {
return 返回值
}
set(新属性值) { //默认newValue
...
}
}
}
代码示例:
//使用下标实现二位数组
struct DoubleDimensionalArray {
let rows: Int, columns: Int
var grid: [Int]
init(rows: Int, columns: Int) {
self.rows = rows;
self.columns = columns;
grid = Array.init(repeating: 0, count: rows * columns)
}
subscript(row: Int, column: Int) -> Int {
get {
return grid[row * columns + column]
}
set {
grid[row * columns + column] = newValue
}
}
}