您的位置:首页 > 移动开发 > Swift

swift学习记录(存储属性)

2015-12-21 14:47 288 查看
属性

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

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 的属性在没有初始化时就同时被多个线程访问,则无法保证该属性只会被初始化一次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: