Swift 属性
Swift 语言提供了类,枚举或结构相关联值的属性。属性可以被进一步分为存储属性和计算属性。
存储性能和计算属性的区别
存储属性 | 计算属性 |
存储常量和变量值的实例 | 计算的值,而不是存储的值 |
通过类和结构提供 | 通过类,枚举和结构提供 |
这两种存储和计算属性与实例类型相关联。当属性与它的类型值相关联,那么它定义为“类型属性”。存储和计算的属性通常与一个特定类型的实例相关联。然而,属性也可以与类型本身相关联。这样的属性是已知的类型的属性。 属性观察者也被使用
-
观察存储的属性值
-
观察子类从父继承而得的属性
存储属性
Swift 介绍存储的属性概念用来存储常量和变量的实例。常量存储的属性由 'let' 关键字定义和存储变量的属性由 “var” 关键字定义。
-
在定义存储的属性提供了“默认值”
-
在初始化期间用户可以初始化和修改初始值
structNumber{var digits:Intlet pi =3.1415}var n =Number(digits:12345) n.digits =67 println("\(n.digits)") println("\(n.pi)")
当我们使用 playground 运行上面的程序,得到以下结果
67 3.1415
考虑在上面的代码,如下面的一行:
let pi = 3.1415
这里,可变圆周率被初始化为存储属性值使用所述实例 pi = 3.1415. 所以,每当实例被称为将持有单独的值是:3.1415。
另一种方法,已存储的属性可能常量结构。这样结构的整个实例将被认为是“常量属性的存储”。
structNumber{var digits:Intlet numbers =3.1415}var n =Number(digits:12345) n.digits =67 println("\(n.digits)") println("\(n.numbers)") n.numbers =8.7
当我们使用 playground 运行上面的程序,得到以下结果
error: cannot assign to 'numbers' in 'n' n.numbers = 8.7
重新初始化'数字'为8.7,它将返回指示“数字''被声明为常数的错误消息。
懒存储属性
Swift 提供了所谓的“懒存储属性',当变量被首次初始化它不会计算初始值. “lazy” 修饰符的变量声明之前,把它作为一个懒存储属性。
延迟属性被使用:
-
要延迟对象的创建。
-
当属性是依赖于一个类的其他部分,即:尚未知道
class sample { lazy varno= number()// `var` declaration is required.}class number {var name ="Swift"}var firstsample = sample() println(firstsample.no.name)
当我们使用 playground 运行上面的程序,我们得到以下结果
Swift
实例变量
在Objective C 中,存储属性还必须有实例变量用于备份目的,存放在存储的属性声明的值。
Swift 集成了这些概念成一个“存储的属性”声明。而不必有一个相应的实例变量和备份值'存储属性“,包含通过变量名一个位置定义的有关变量属性所有信息集成,数据类型和存储器管理功能。
计算属性
而不是存储计算的属性值提供了一个getter和一个可选的 setter 间接来检索和设置其他属性和值。
class sample {var no1 =0.0, no2 =0.0var length =300.0, breadth =150.0var middle:(Double,Double){get{return(length /2, breadth /2)}set(axis){ no1 = axis.0-(length /2) no2 = axis.1-(breadth /2)}}}var result = sample() println(result.middle) result.middle =(0.0,10.0) println(result.no1) println(result.no2)
当我们使用 playground 运行上面的程序,我们得到以下结果
(150.0, 75.0) -150.0 -65.0
当计算的属性留下了新的值为未定义默认值将针对特定的变量来设置。
计算属性为只读属性
在计算属性只读属性被定义为 getter,但不是 setter。它总是用来返回一个值。变量通过使用 '.' 语法访问,但不能被设置为其他值。
class film {var head =""var duration =0.0var metaInfo:[String:String]{return["head":self.head,"duration":"\(self.duration)"]}}var movie = film() movie.head ="Swift Properties" movie.duration =3.09 println(movie.metaInfo["head"]!) println(movie.metaInfo["duration"]!)
当我们使用 playground 运行上面的程序,我们得到以下结果
Swift Properties 3.09
计算属性属性观察者
在Swift 中使用属性观察者来观察和设置属性值响应。 当每一次属性值设置属性观察者都被调用。 除了懒存储属性,我们可以通过添加属性观察者“继承”属性“覆盖”方法。
-
在存放值之前 - willset
-
存储新的值之后 - didset
-
当一个属性被设置在初始化 willset 和 didset 观察者不能调用。
classSamplepgm{var counter:Int=0{ willSet(newTotal){ println("Total Counter is: \(newTotal)")} didSet{if counter > oldValue { println("Newly Added Counter \(counter - oldValue)")}}}}letNewCounter=Samplepgm()NewCounter.counter =100NewCounter.counter =800
当我们使用 playground 运行上面的程序,我们得到以下结果
Total Counter is: 100 Newly Added Counter 100 Total Counter is: 800 Newly Added Counter 700
局部和全局变量
对于计算和观察属性局部和全局变量的声明。
局部变量 | 全局变量 |
那些在函数,方法或封闭环境中定义的变量 | 被外界函数,方法,关闭或类型的上下文定义的变量 |
用于存储和检索值 | 用于存储和检索值 |
存储属性是用来获取和设置值 | 存储属性是用来获取和设置值 |
也可用于计算属性 | 也可用于计算属性 |
类型属性
属性定义类型定义部分有大括号{},并且变量的范围也被前面所定义。要定义值类型使用 “static” 关键字以及类的类型使用 “class” 关键字。
语法
structStructname{staticvar storedTypeProperty =" "staticvar computedTypeProperty:Int{// return an Int value here}}enumEnumname{staticvar storedTypeProperty =" "staticvar computedTypeProperty:Int{// return an Int value here}}classClassname{classvar computedTypeProperty:Int{// return an Int value here}}
查询和设置属性
类似于实例属性类型属性查询和设置,只是使用 “.” 语法,而不用指向该实例的类型。
structStudMarks{staticlet markCount =97staticvar totalCount =0varInternalMarks:Int=0{ didSet {ifInternalMarks>StudMarks.markCount {InternalMarks=StudMarks.markCount }ifInternalMarks>StudMarks.totalCount {StudMarks.totalCount =InternalMarks}}}}var stud1Mark1 =StudMarks()var stud1Mark2 =StudMarks() stud1Mark1.InternalMarks=98 println(stud1Mark1.InternalMarks) stud1Mark2.InternalMarks=87 println(stud1Mark2.InternalMarks)
当我们使用 playground 运行上面的程序,我们得到以下结果
97 87