本人录制技术视频地址:https://edu.csdn.net/lecturer/1899 欢迎观看。
Swift中属性的用法比objective-c中属性的用法丰富了很多。下面我逐一介绍。
一、 存储属性 和 延迟存储属性
Demo如下:
class Dog {
var name = "旺财"
init(){
println("狗被初始化了")
}
}
class Person {
let age = 20
var name = "Jack"
var height = 0.0
lazy var dog = Dog()
}
var p = Person()
p.dog
1. Dog中的name属性和Person中的age,name,height均为存储属性,用来存储对象的普通属性值。
2. Person中的dog属性,它也是存储属性,只不过它的属性值是Dog对象,而dog属性前面又有了lazy关键字修饰,它就成为了延迟存储属性。
3. 延迟存储属性:第一次用到的时候才初始化,不能作用于常量上面,一般作用于对象上面。上面代码 var p = Person()执行完毕后,dog属性并没有被初始化。当执行完p.dog后,dog才被初始化一个Dog对象。
二、 计算属性
Swift中的计算属性,很类似与C#中的get;set;属性。
Demo如下(计算正方形周长);
class Square {
var width: Double = 10
var grith: Double {
get{
return width * 4
}
set{
width = newValue / 4
}
}
}
var s = Square()
s.width // 10
s.grith // 40
s.grith = 100 // width : 25
class Square {
var width: Double = 10
var grith: Double {
get{
return width * 4
}
set(myValue){
width = myValue / 4
}
}
}
注:存储属性必须对属性进行数据初始化操作(除非使用了构造方法,下一节进行讲解);而计算属性可以借助存储属性进行一些计算操作,而得到最终的结果。
三、 类型属性类型属性简称类属性。
1. 只能是计算属性。
2. 不管创建多少个实例,这些实例共享一份资源。
class Square {
class var PI: Double{
return 3.14
}
}
println("PI的值:\(Square.PI)")
class Square {
class var PI: Double{
get{
return 3.14
}
}
}
四、 属性监视器
1. 如果是计算属性,直接在set方法中监听即可,类似于objective-c中的kvo方式监听属性。
2. 如果是存储属性,我们需要使用willSet和didSet进行监视。
Demo如下:
class Square {
var width: Double = 0.0 {
willSet{
println("New Value:\(newValue), Current Value:\(width)")
}
didSet{
println("Old Value:\(oldValue), Current Value:\(width)")
}
}
}
var s = Square()
s.width = 100
New Value:100.0, Current Value:0.0
Old Value:0.0, Current Value:100.0
五、属性重写
可以将一个继承来的只读属性重写为一个读写属性。
class Animal {
var speed: Int {
get {
return 100
}
}
}
class Dog: Animal {
override var speed: Int {
get {
return 300
}
set {
}
}
}
class Animal {
var speed: Int {
get {
return 100
}
set {
}
}
}
class Dog: Animal {
override var speed: Int {
get {
return 100
}
}
}
class Animal {
var speed: Int = 0 {
willSet {
println("Animal - willSet")
}
didSet {
println("Animal - didSet")
}
}
}
class Dog: Animal {
override var speed: Int {
willSet {
println("Dog - willSet")
}
didSet {
println("Dog - didSet")
}
}
}
var d = Dog()
d.speed = 10
最终打印结果
Dog - willSet
Animal - willSet
Animal - didSet
Dog - didSet