swift学习记录(存储属性)

属性

属性将值跟特定的类、结构体和枚举关联。

swift中的属性分为存储属性计算属性两种。

存储属性:

一个存储属性就是存储在特定类或结构体的实例里的一个常量或变量。存储属性可以是变量存储属(用关键字var 定义),

也可以是常量存储属性(用关键字let 定义)。

class Person{
    let id:Int  = 0
    var name :String = ""
}

let boy = Person()
boy.id = 1    //编译报错,常量属性不能修改
boy.name = "张三" //变量属性可以修改

常量结构体的存储属性

如果创建了一个结构体的实例并将其赋值给一个常量,则无法修改该实例的任何属性,即使定义了变量存储属性:

struct Person{
    var id:Int  = 0
    var name :String = ""
}

let boy = Person()
 // 编译报错,常量结构体的属性不能修改
boy.id = 1
boy.name = "张三"

这种行为是由于结构体(struct)属于值类型。当值类型的实例被声明为常量的时候,它的所有属性也就成了常量。

属于引用类型的类(class)则不一样。把一个引用类型的实例赋给一个常量后,仍然可以修改该实例的变量属性。


延迟存储属性

使用 lazy 关键字 声明。延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性。

延迟存储属性必须是变量,因为属性的初始值可能在实例构造完成之后才会得到。而常量属性在构造过程完成之前必须要有初始值,因此无法声明成延迟属性。

当属性的值依赖于在实例的构造过程结束后才会知道具体值的外部因素时,或者当获得属性的初始值需要复杂或大量计算时,可以只在需要的时候计算它。这时就

需要用到 延迟存储属性。

class DataImporter {
/*
DataImporter 是一个将外部文件中的数据导入的类。
这个类的初始化会消耗不少时间。*/
    var fileName = "data.txt"
    // 这是提供数据导入功能
}
class DataManager {
    lazy var importer = DataImporter()
    var data = [String]()
    // 这是提供数据管理功能
}
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
// DataImporter 实例的 importer 属性还没有被创建
print(manager.importer.fileName) //importer 属性只有在第一次被访问的时候才被创建
// DataImporter 实例的 importer 属性现在被创建了
// 输出 "data.txt”

注意:

如果一个被标记为lazy 的属性在没有初始化时就同时被多个线程访问,则无法保证该属性只会被初始化一次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值