importUIKitclassPerson{var name :String=""{// 属性监听器// 1.监听属性即将发生改变willSet{print("属性即将发生改变\(name)")print(newValue)}// 2.监听属性已经发生改变didSet(oldName){print("属性已经发生改变\(name)")print(oldName)}}}let p =Person()
p.name ="aaa"
p.name ="bbb"
类的构造函数
importUIKit/*
使用KVC的条件
1> 必须继承NSObject
2> 必须在构造函数中,先调用super.init()
3> 调用setValuesForKeys
4> 如果字典中n某一个key没有对应的属性,则需要重写setValue forUndefinedKey方法
*/classPerson:NSObject{var name :String=""var age :Int=0init(dict :[String:Any]){/*
if let name = dict["name"] as? String {
self.name = name
}
if let age = dict["age"] as? Int {
self.age = age
}
*/super.init()setValuesForKeys(dict)}overridefuncsetValue(_ value:Any?, forUndefinedKey key:String){}}let p =Person(dict:["name":"aaa","age":18])
类的析构函数
importUIKitclassPerson{var name :String=""var age :Int=0// 重写析构函数,监听对象的销毁deinit{print("Person --- deinit")}}var p :Person?=Person()
p =nil
自动引用计数
工作机制
Swift和OC一样,采用自动引用计数来管理内容
当有一个强引用指向某个对象时,该对象的引用计数就回自动+1
当该强引用消失时,引用计数会自动-1
当引用计数为0时,该对象会被销毁
循环引用
importUIKit/*
OC中表示n弱引用
__weak __unsafe_unretained(野指针错误)
Swift中表示弱引用
weak unowned(野指针错误)
*/// 1.创建类classPerson{var name :String=""var book :Book?deinit{print("Person --- deinit")}}classBook{var price :Double=0.0weakvar owner :Person?deinit{print("Book --- deinit")}}// 2.创建对象var person :Person?=Person()
person!.name ="abc"var book :Book?=Book()
book!.price =60.0
person!.book = book
book!.owner = person
person =nil
book =nil
可选链
importUIKit// 1.创建类classPerson{var name :String=""var dog :Dog?}classDog{var weight :Double=0.0var toy :Toy?}classToy{var price :Double=0.0funcflying(){print("flying...")}}// 2.创建类的对象let p =Person()
p.name ="abc"let d =Dog()
d.weight =60.0let t =Toy()
t.price =100
p.dog = d
d.toy = t
// 3.可选链的使用/* 不推荐,非常危险
let dog = p.dog
let toy = dog?.toy
let price = toy?.price
*//* 太麻烦
if let dog = p.dog {
if let toy = dog.toy {
let price = toy.price
}
}
*/// ?. 就是可选链,系统会自动判断可选类型是否有值,如果有值,则解包;如果没有值,则赋值为nil// 注意:可选链获取的值,一定是可选类型let price = p.dog?.toy?.price
// 如果可选链中有一个可选类型是没有值,那么这个语句不执行
p.dog?.toy?.price =50// 可选链调用方法
p.dog?.toy?.flying()