Swift 属性与下标

swift中属性分为静态属性和存储属性,存储属性类似于OC中的数据成员,计算属性不存储数据

存储属性

存储属性适用于类、结构体(枚举只有静态存储属性)

  1. 延时存储属性
    俗称:懒加载,只有在首次调用的时候才初始化。
struct structOne {
    let name: String = "zhangsan"
}

class classOne {
    lazy var paramary: structOne = structOne()
}
  1. 计算属性
    计算属性本身并不存储数据,他通过计算返回数据。类、结构体、枚举都可以定义计算属性
    计算属性必须使用var修饰,语法结构如下:
面向对象类型  类型名 {       
        var 计算属性名: 就算属性类型 {
            get {
                return 计算后属性值
            }
            set(新属性值) {             //默认newValue
                          
            }
        }
    }

只读计算属性 (省略setter访问器,省略get{}代码)。语法如下:

var fullName: String {      
      return “sun” + “tao”  
}
  1. 属性观察者
    属性观察者能够监听存储属性的变化,不能监听延迟存储属性和常量存储属性的变化

wiiSet: 观察者在修改之前调用
didSet:观察者在修改之后调用

语法结构

面向对象类型  类型名 {

        var 存储属性:数据类型 = 初始化值 {

            willSet(新值) {
            …
            }
            didSet(旧值) {
             …
            }
        }
    }
  1. 静态属性
    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
        }
    }
}

你可能感兴趣的:(Swift 属性与下标)