Swift 属性学习笔记
2016-10-13 14:20
204 查看
属性
属性的值,与类、结构、枚举关联;存储属性、计算属性都是一个实例的一部分,存储属性用来存储常量let、变量var,计 算属性用来计算值,不 存储;计算属性在类、枚举、结构中有用;存储属性在类、结构中有用; 通常存储、计算属性是实例的特定类型 ,但是,属性也可以是自己的类型,这样的属性为类型属性 但是,你也可以定义属性观察性来监控属性值得变化,通过这可以相应用户自定义的操作, 自己定义的存储属性,与父类继承过来的属性都可以添加观察器;
1、存储属性
简单的讲,存储属性就是,特定的类、结构的里定义的常量或变量;
//定义一个结构,实例创建后长度不能发生改变 struct FixedLengthRange { var firstValue:Int //存储变量属性 let length:Int //存储常量属性 } var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3) rangeOfThreeItems.firstValue=3 //rangeOfThreeItems.length=5//会报错,因为length是常量; let rangeOfForItems=FixedLengthRange(firstValue: 0, length: 4) //rangeOfForItems.firstValue=2 //rangeOfForItems.length=3 都会报错,rangeOfForItems是常量,同时结构 是数值类型 //结论 一个常量的结构体实例,其里面的属性是不可变的; 不管属性是常量还是变量
//定义一个类,实例创建后长度不能发生改变 class FixLengthRange { var firstValue:Int? //存储变量属性, let length:Int=10 //存储常量属性 } let rangeOfFiveItems = FixLengthRange() rangeOfFiveItems.firstValue=20//可以修改,一个常量的类实例,其变量属性是可以修改的 //rangeOfFiveItems.length=30 //错的,不管什么情况,常量属性不可修改 //结论 一个常量的类实例,其变量属性是可以修改的,不管什么情况,常量属性不可修改
2、延迟存储属性
延迟存储属性,第一次被调用时,才会赋值,初始化时是不会计算值;在属性前加个 lazy关键字就行 比如一个复杂的类作为属性,就可以设置为延迟属性;
//负责的类用来,加载文件,是一个耗时操作 class DataImporter { var fileName="data.txt" } class DataManger { lazy var importer=DataImporter()//加个lazy,等到第一次调用的时候在初始化 var data = [String]() } let manger=DataManger()//初始化 importer 没初始化 manger.data.append("some data") //importer 没初始化 manger.data.append("some more data") //importer 没初始化 print("fileName=\(manger.importer.fileName) \ndata=\(manger.data)")//初始化 //注意,lazy 不要加在常量属性上,常量属性 在初始化完成之前就要加载完成
3、计算属性 间接存储值,用.语法取值,=赋值
// 下面定义三个结构体,来描述一个矩形 struct Point { var x = 0.0, y = 0.0 } struct Size { var width = 0.0, height = 0.0 } struct Rect { var origin = Point() var size = Size() //center 计算属性; 通过get set 间接取值,设置值 var center: Point{ get{ let centerX = origin.x + (size.width * 0.5) let centerY = origin.y + (size.height * 0.5) return Point(x: centerX, y: centerY) } set(newCenter){ origin.x = newCenter.x - (size.width * 0.5) origin.y = newCenter.y - (size.height * 0.5) } } } var rect=Rect(origin: Point(x: 1, y: 2), size: Size(width: 12, height: 23)) let center = rect.center //.语法取值 print(rect.center) rect.center=Point(x: 23, y: 23)//直接用赋值符号 赋值 print(rect.origin)
4、属性观察器 多了两个方法,willSet(在新的值设置之前被调用) ,didSet(新的值设定之后被调用)
class Person{ var name = "张三"{ //新的值设置之前被调用 willSet(newName){ print("newName=\(newName)") } //新的值设定之后被调用 didSet(oldName){ print("oldName=\(oldName)") } } } var person=Person() print("name=\(person.name)") person.name="张四" //结果 name=张三 newName=张四 oldName=张三
相关文章推荐
- Swift学习笔记 - Swift属性只读
- Swift学习笔记 - Swift属性只读
- Swift学习笔记——函数、方法,属性
- Swift 属性学习笔记
- 学校学习ios教程笔记,第七节swift中的类与对象的属性和懒加载
- swift学习笔记之数据持久化(属性列表)
- Swift学习笔记—— 属性
- swift 学习笔记(22)-属性(存储属性/延迟属性)
- Swift学习笔记(15)——属性
- swift 学习笔记(23)-属性(计算属性)
- swift学习笔记之--类的计算属性
- Swift学习笔记第六篇(类,属性,方法)
- swift学习笔记之-属性
- 属性—Swift学习笔记(十三)
- Swift学习笔记(八)属性
- swift学习笔记--计算属性和存储属性的区别
- Swift学习笔记(13)--属性 (Properties)
- swift 学习笔记(23)-属性(属性观察器)
- Swift学习笔记10——属性(Properties)
- swift学习笔记(10)-属性