前端之家收集整理的这篇文章主要介绍了
Swift 属性学习笔记,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
属性的值,与类、结构、枚举关联;存储属性、计算属性都是一个实例的一部分,存储属性用来存储常量let、变量var,计 算属性用来计算值,不 存储;计算属性在类、枚举、结构中有用;存储属性在类、结构中有用;
通常存储、计算属性是实例的特定类型 ,但是,属性也可以是自己的类型,这样的属性为类型属性
但是,你也可以定义属性观察性来监控属性值得变化,通过这可以相应用户自定义的操作, 自己定义的存储属性,与父类继承过来的属性都可以添加观察器;
简单的讲,存储属性就是,特定的类、结构的里定义的常量或变量;
@H_502_10@//定义一个结构,实例创建后长度不能发生改变
struct FixedLengthRange {
var firstValue:Int @H_502_10@//存储变量属性
let length:Int @H_502_10@//存储常量属性
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0,length: 3)
rangeOfThreeItems.firstValue=3
@H_502_10@//rangeOfThreeItems.length=5//会报错,因为length是常量;
let rangeOfForItems=FixedLengthRange(firstValue: 0,length: 4)
@H_502_10@//rangeOfForItems.firstValue=2
@H_502_10@//rangeOfForItems.length=3 都会报错,rangeOfForItems是常量,同时结构 是数值类型
@H_502_10@//结论 一个常量的结构体实例,其里面的属性是不可变的; 不管属性是常量还是变量
@H_502_10@//定义一个类,实例创建后长度不能发生改变
class FixLengthRange {
var firstValue:Int? @H_502_10@//存储变量属性,
let length:Int=10 @H_502_10@//存储常量属性
}
let rangeOfFiveItems = FixLengthRange()
rangeOfFiveItems.firstValue=20@H_502_10@//可以修改,一个常量的类实例,其变量属性是可以修改的
@H_502_10@//rangeOfFiveItems.length=30 //错的,不管什么情况,常量属性不可修改
@H_502_10@//结论 一个常量的类实例,其变量属性是可以修改的,不管什么情况,常量属性不可修改
2、延迟存储属性
延迟存储属性,第一次被调用时,才会赋值,初始化时是不会计算值;在属性前加个 lazy关键字就行
比如一个复杂的类作为属性,就可以设置为延迟属性;
@H_502_10@//负责的类用来,加载文件,是一个耗时操作
class DataImporter {
var fileName="data.txt"
}
class DataManger {
lazy var importer=DataImporter()@H_502_10@//加个lazy,等到第一次调用的时候在初始化
var data = [String]()
}
let manger=DataManger()@H_502_10@//初始化 importer 没初始化
manger.data.append("some data")
@H_502_10@//importer 没初始化
manger.data.append("some more data")
@H_502_10@//importer 没初始化
print("fileName=\(manger.importer.fileName) \ndata=\(manger.data)")@H_502_10@//初始化
@H_502_10@//注意,lazy 不要加在常量属性上,常量属性 在初始化完成之前就要加载完成
3、计算属性 间接存储值,用.语法取值,=赋值
@H_502_10@// 下面定义三个结构体,来描述一个矩形
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()
@H_502_10@//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 @H_502_10@//.语法取值
print(rect.center)
rect.center=Point(x: 23,y: 23)@H_502_10@//直接用赋值符号 赋值
print(rect.origin)
4、属性观察器 多了两个方法,willSet(在新的值设置之前被调用),didSet(新的值设定之后被调用)
class Person{
var name = "张三"{
@H_502_10@//新的值设置之前被调用
willSet(newName){
print("newName=\(newName)")
}
@H_502_10@//新的值设定之后被调用
didSet(oldName){
print("oldName=\(oldName)")
}
}
}
var person=Person()
print("name=\(person.name)")
person.name="张四"
@H_502_10@//结果 name=张三 newName=张四 oldName=张三
原文链接:https://www.f2er.com/swift/322845.html