美文网首页
7.属性与方法

7.属性与方法

作者: LucXion | 来源:发表于2020-06-08 18:02 被阅读0次

    存储属性与计算属性,
    类属性类方法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])
    

    相关文章

      网友评论

          本文标题:7.属性与方法

          本文链接:https://www.haomeiwen.com/subject/rczrtktx.html