您的位置:首页 > 移动开发 > Swift

Swift学习记录 -- 13.类的构造方法及属性监听

2016-10-03 14:36 387 查看
类的构造方法原理和OC差不多 , 只是属性手动赋值时 , 有些麻烦 , 也有些难以理解 , 不过幸好有KVC , 解决了大部分问题 . 至于属性观察 , 调用的方法想必也不陌生 , 不错 , 正是OC中咱们重写KVO set方法里的那两个方法(willChange和didChange) , 只是名字有所变化

//1.在创建对象时, 实质上已经是调用了构造函数
let p = Person()

//2.初始化一个对象时就对其进行赋值
let p1 = Person(age: 18, name: "my")

//3.传入字典进行对象初始化(手动赋值)
let p2 = Person(dict: ["name":"my","age":18,"height":1.88])

//4.传入字典进行对象初始化 (KVC赋值)
let p3 = Person(dict1: ["name":"my","age":18,"height":1.88])

//属性监听器
let dog = Dog(dict2: ["name":"ahuang","age":3])


// person类
class Person :NSObject {

var age :Int = 0
var name :String? = nil

//1.重写构造函数  //需要加上override
override init() {

super.init() //构造函数中,如果不调用父类构造函数,系统会自动调用,所以可写可不写
print("---")
}

//2.自定义构造函数1 (初始化对象时就进行复制)
init(age:Int,name :String) {

self.age = age  //虽然可以直接获取age,但是为了区分,需要加上self
self.name = name
}

//3.自定义构造函数2 (参数为字典)
init(dict:[String:AnyObject]) {

//注意:从字典中取出的值["name"]等为可选类型,因为取出的值是不确定的,有可能值不为空,也有可能为nil,所以写法如下

// as? 最终转换成的类型是一个可选类型
// as! 最终转换成的类型是一个确定类型

//这里没必要进行是否为空判断,因为对可选类型进行取值时,一定会进行判断
name = dict["name"] as? String //name为可选类型,需要把dict["name"]AnyObject?转换成String可选类型进行赋值

//不能直接取值进行赋值,因为["age"]为AnyObject?
if let age = dict["age"] as? Int {
self.age = age
}
}

//4.自定义构造函数3 (KVC赋值,使用KVC会自动帮我们进行判断和转换 , 就跟OC里一样自动类型转换)
init(dict1 : [String:AnyObject]) {

super.init()
setValuesForKeysWithDictionary(dict1)//调用KVC必须要先调用父类构造方法,可以不可以省略了, 因为给对象赋值,必须要先保证对象已经被创建出来
}

//重写undefineKey方法 , 防止找不到对应的键进行赋值崩溃 (跟OC一样)
override func setValue(value: AnyObject?, forUndefinedKey key: String) {
//不进行任何操作
}
}


// Dog类 (属性变化监听)
class Dog: NSObject {

var age = 0 { //直接在属性后面加{},写willSet和didSet对属性进行监听

//属性即将改变时监听
willSet {
print("旧值:\(age)") //此处存在一临时变量 newValue(系统产生)
}
//属性已经改变时监听
didSet {
print("新值:\(age)")//此处存在一临时变量oldValue(系统产生)
}
}
var name:String? = nil

//自定义构造函数
init(dict2 : [String :AnyObject]) {

super.init()
setValuesForKeysWithDictionary(dict2)
}
override func setValue(value: AnyObject?, forUndefinedKey key: String) {
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数 swift 对象