Swift 属性学习笔记

属性

属性的值,与类、结构、枚举关联;存储属性、计算属性都是一个实例的一部分,存储属性用来存储常量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=张三
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值