Swift-属性

存储属性

  • 存储属性是会占用实例对象的内存

  • 可以通过varlet来声明

  • 结构体和类都支持存储属性

  • 结构体属于值类型,实例赋值给常量,所有属性都成了常量, 不能修改

struct Teacher {
    let name = ""
    var age = 0
}

var teacherA = Teacher()
teacherA.age = 30
teacherA.name = "TeacherA"    //报错


let teacherB = Teacher()
teacherB.age = 30            //报错
teacherB.name = "TeacherB"   //报错
复制代码
  • 类是引用类型,不管赋给变量还是常量,都可以修改变量属性的值
class Teacher1 {
    let name = ""
    var age = 0
}

var teacher1 = Teacher1()
teacher1.age = 30
//teacher1.name = "TeacherA"    //报错


let teacher2 = Teacher1()
teacher2.age = 30
//teacher2.name = "TeacherB"   //报错
复制代码

延迟存储属性 lazy

  • 第一次被调用时才初始化
  • lazy修饰的变量,必须有一个默认的初始值

class Friend{
    //!会自动解包
    var name: String!
    init() {
        print("Friend 初始化")
    }
}

class Hobby{
    var name: String!
    init() {
        print("Hobby 初始化")
    }
}

class Student {
    var name: String!
    var hobby :Hobby = Hobby()
    lazy var friend:Friend = Friend()
}
//属性 hobby 会随着 Student 初始化而初始化
//lazy修饰的属性friend 在使用时才执行初始化
var stu = Student()
stu.friend.name = "韩梅梅"

//Hobby 初始化
//Friend 初始化

复制代码

计算属性 get set

  • 不会存储值, 不占用实例对象的内存
  • 只能用关键字var声明, 值是不固定的
  • 提供getter和可选setter
  • 本质是 get和set方法,存放在元数据(Metadata)中
class Square {
    var width: Double = 8.0
    var area: Double {
        get {
            return width * width
        }
        //默认名称 newValue
        set (newValue){
            width = sqrt(newValue)
        }
    }
}

let s = Square()
print(s.area)
s.area = 25.0
print(s.width)

//64.0
//5.0
复制代码
class_getInstanceSize(Square.self) // 24
复制代码

只读计算属性 get

  • 只有getter方法,没有setter方法
  • 可省略get{}
class Square1 {
    var width: Double = 8.0
    var area: Double {
        get {
            return width * width
        }
    }
}

class Square2 {
    var width: Double = 8.0
    var area: Double {
        return width * width
    }
}

复制代码

属性观察者 willset didset

class Square3 {
    var area: Double = 0.0 {
        willSet {
            print("newValue -- \(newValue) , value --\(area)")
        }
        
        didSet {
            print("oldValue -- \(oldValue), value --\(area)")
        }
    }
}

let s3 = Square3()
s3.area = 18

//newValue -- 18.0 , value --0.0
//oldValue -- 0.0, value --18.0
复制代码

类型属性 static class

  • 类型属性必须有默认值
class Person {
     static var age: Int = 0
}

let age = Person.age
print(age)
复制代码
  • 使用class来代替static定义类型属性
  • 区别,class 允许子类重写父类的实现
class Person {
    static var name:String  = "person"
    static var age:Int {
        return 15
    }
    class var hobby:String {
        return "hobby"
    }
}

class Student:Person {
    class override var hobby: String {
        return "student"
    }

}

复制代码

static单例

  • static关键字是线程安全的,并只初始化一次
  • 使用static来创建单例
class Animal {
    static let sharedInstance = Animal()
    private init() {
        
    }
}
let a = Animal.sharedInstance
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享