7.属性与方法

2020-06-08  本文已影响0人  LucXion

存储属性与计算属性,
类属性类方法class/static,
使用let和var接收值类型或引用类型变量的区别,
属性监听器willSet、didSet,
类实例通过下标获取数据subscript

Swift语言中对于属性的定义分为两类,分别是存储属性与计算属性。从字面意思理解,存储属性的作用是存储类的某个特征,而计算属性的作用是通过运算告知外界类的某个特征。存储属性只能用于类和结构体,计算属性可以用于类、结构体和枚举。

变量类型的属性可以修改,常量类型的属性不可修改。但是对于值类型实例,如果实例是常量接收的,则其中变量的属性也不可以修改。对于引用类型实例,无论实例是变量还是常量接收的,都可以修改变量类型的属性.

let 对象=  struct结构 + var属性 // 那么var属性不能修改
var 对象= struct结构 + var属性 // var属性可以修改
let 对象= class类型 + var属性  // var属性可以修改

存储属性可以通过lazy关键字设置为延迟加载,但是延迟加载的属性必须设置默认值
延时存储属性并不是线程安全的,如果在多个线程中对延时存储属性进行调用,不能保证其只被构造一次。

class Circle {
    var center:CGPoint
    var r:Double
    lazy var something:String = "happy"// 延迟属性
    // 计算属性
    var round:Double {// 将属性扩展作用域
        set (value){// 分别声明set、get,set中有个newValue默认值,这里自定义成value
            r = value / 2 / Double.pi
        }
        get {
            return 2 * Double.pi * r
        }
    }
    var round:Double {
        // 由于setter是可选的,不实现代表该计算属性为只读,只剩下一个getter时可省略成这样的形式
        return 2 * Double.pi * r
    }
    init(center:CGPoint,r:Double) {
        self.center = center
        self.r = r
    }
}
属性监听器,用于监听存储属性的赋值操作 willSet/didSet
class Circle {
    
    var center:CGPoint = CGPoint(x: 0, y: 0) {
        willSet {
            print("\(newValue)")//是一个常量
        }
        didSet {
            print("\(oldValue)")
            self.center = CGPoint(x: 15, y: 15)// 此处可以修改属性的最终值
        }
    }
    
    init(center:CGPoint) {
        // 设置默认值和init中对属性初始化都不会触发属性监听器
        self.center = CGPoint(x: 0, y: 0)
    }
}

类属性

class Student {
    // static修饰,静态属性
    static var name:String = ""
    static var key:String {
        return "key"
    }
    // class修饰,计算属性,子类可重写
    class var age:Int {
        return 1
    }
}
class StudentA :Student {
    override class var age: Int {
        return 3
    }
}
通过下标获取类属性
// 对象下标调用
class Student {
    
    var array:Array<Array<Int>>
    
    init(array:Array<Array<Int>>) {
        self.array = array
    }
    
    subscript (_ parama:Int,_ parama2:Int)->Int{
        set {
            array[parama][parama2] = newValue
        }
        get {
            return array[parama][parama2]
        }
    }
}
var temp = Student.init(array: [[1,2,3,4,5],[4,5,6,7,8],[123]])
print(temp[1,2])
上一篇下一篇

猜你喜欢

热点阅读