swift学习记录(存储属性)
2015-12-21 14:47
288 查看
属性
属性将值跟特定的类、结构体和枚举关联。
swift中的属性分为存储属性和计算属性两种。
存储属性:
一个存储属性就是存储在特定类或结构体的实例里的一个常量或变量。存储属性可以是变量存储属性(用关键字var
定义),
也可以是常量存储属性(用关键字let
定义)。
常量结构体的存储属性
如果创建了一个结构体的实例并将其赋值给一个常量,则无法修改该实例的任何属性,即使定义了变量存储属性:
这种行为是由于结构体(struct)属于值类型。当值类型的实例被声明为常量的时候,它的所有属性也就成了常量。
属于引用类型的类(class)则不一样。把一个引用类型的实例赋给一个常量后,仍然可以修改该实例的变量属性。
延迟存储属性
使用 lazy 关键字 声明。延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性。
延迟存储属性必须是变量,因为属性的初始值可能在实例构造完成之后才会得到。而常量属性在构造过程完成之前必须要有初始值,因此无法声明成延迟属性。
当属性的值依赖于在实例的构造过程结束后才会知道具体值的外部因素时,或者当获得属性的初始值需要复杂或大量计算时,可以只在需要的时候计算它。这时就
需要用到 延迟存储属性。
注意:
如果一个被标记为lazy 的属性在没有初始化时就同时被多个线程访问,则无法保证该属性只会被初始化一次。
属性将值跟特定的类、结构体和枚举关联。
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 的属性在没有初始化时就同时被多个线程访问,则无法保证该属性只会被初始化一次。
相关文章推荐
- <swift学习之路> UIAlertController的简单使用
- swift Touch ID 的简单使用 指纹识别
- swift 学习记录(类和结构体)
- 《从零开始学Swift》学习笔记(Day 50)——扩展计算属性、方法
- 《从零开始学Swift》学习笔记(Day 50)——扩展计算属性、方法
- swift学习记录(枚举)
- Swift 正式开源, 包括 Swift 核心库和包管理器
- Swift 控制流(笔记)
- Swift.cn Alpha聚乐部 总结
- IOS(swift)-数据存储 · 用NSUserDefaults存储配置信息
- swift-基础06-元组和Optionals(可选)
- swift-基础05-类型别名和Bool型
- swift-基础04-数字类型转换
- iOS --- 总结Swift中常用的全局函数和extension(持续更新中)
- swift 进阶笔记 (一) —— 可选型
- 基于EF6的快速开发Web框架——Swift.Net
- OpenStack中Swift和cinder区别
- iOS开发——UI篇Swift篇&UISegmentedControl
- 项目开发笔记-2015.12.20-swift
- 关于swift的访问级别