博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift 属性 笔记更新
阅读量:5835 次
发布时间:2019-06-18

本文共 2703 字,大约阅读时间需要 9 分钟。

  hot3.png

属性

属性的值,与类、结构、枚举关联;存储属性、计算属性都是一个实例的一部分,存储属性用来存储常量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=张三

转载于:https://my.oschina.net/xiuer/blog/1068571

你可能感兴趣的文章
云计算企业业绩分化明显 9家上市公司中期预喜
查看>>
《VMware Virtual SAN权威指南(原书第2版)》一3.5 可能发生的网络配置问题
查看>>
SK电讯发布Q2财报 净利润同比下降26.9%
查看>>
零售品牌如何驾驭大数据主导商业决策?
查看>>
经济模式UPS在数据中心的应用(上)
查看>>
Intel首款32核Xeon E5 v5跑分曝光:史上最强
查看>>
中国基于国产龙芯处理器的大数据一体机
查看>>
物联网影响商业发展三要素
查看>>
China Unicom and Chunghwa Telecom work together&nb
查看>>
Java图片上查找图片算法
查看>>
Python fabric实现远程操作和部署
查看>>
详解Java中staitc关键字
查看>>
前中情局局长:FBI目的是从根本上改善iPhone
查看>>
大隐隐于市,你身边的那些安全隐患你都知道么?
查看>>
物联网市场迅猛发展 “中国芯”如何把握机会?
查看>>
环球花木网的目标就是致力于打造成为“园林相关行业的专业性门户网站
查看>>
《编写高质量代码:改善c程序代码的125个建议》—— 建议14-1:尽量避免对未知的有符号数执行位操作...
查看>>
《C语言编程魔法书:基于C11标准》——2.2 整数在计算机中的表示
查看>>
全球程序员编程水平排行榜TOP50,中国排名第一
查看>>
HDFS 进化,Hadoop 即将拥抱对象存储?
查看>>