趁着最近有空闲的时间,想感受一下Swift的简洁and优雅,不过小菜鸟还在Swift的优雅简洁之路上匍匐前进,欢迎指正,共同学习进步……
构造函数:init()
作用:1.给成员变量分配空间 2.初始化
在OC中:1.调用父类方法super.init 分配空间 2.初始化 如下:
- (instancetype)init{
//1.调用父类构造方法
self = [super init];
if (self) {
//2.初始化
}
return self;
}
但在swift中与之相反:1.先实例化自己的对象 2.调用父类方法分配空间 如下:
//必选属性 的构造函数
//一般都为可选「除基本数据类型 后面有说到」
var name :String
override init() {
self.name = "lu"
super.init()
}
/**
必选属性 的构造函数
小结:1 .非optional的属性必须在构造函数中设置初始值,从而保证对象在实例化的时候,属性正确被初始化
2.调用父类super.init 前,必须保证本类属性已初始化
3.swift中 构造函数不用写 func
*/
重载/重写 构造函数
1.重写:override 关键字
//重写 :父类存在相同方法,子类重新编写父类方法
override init() {
self.name = "lu"
super.init()
}
2.重载:overload
//重载 [函数名相同 参数和参数个数不同]
init(name:String) {
//参数name给属性赋值
self.name = name
super.init()
}
//注:如果重载了构造函数 并且没有实现父类init方法 系统不在提init()
//注:OC中没有重载 只有initwithxxxxx
KVC 构造函数
//KVC 函数调用
var sex : String?
//1.定义模型属性【对象】时 一般是可选 避免写构造函数
//var num :Int?
var num :Int = 7
//2.基本数据类型 不能设置成可选的 而且要设置一个初始值 否则会崩溃【必选】
//3.private 属性 外界无法访问【KVC时 属性不能为private的】
//使用字典给属性设置初始值
init(dict:[String:AnyObject]) {
//1.先调用父类 初始化完成
super.init(name: "")
//2.KVC方法
setValuesForKeys(dict)
}
/**
1.可选属性优点
小结:1.避免写构造函数,简化代码
2.需要的时候再创建,节省内存
3.定义模型属性【对象】时 一般是可选;
基本数据类型 不能设置成可选的 而且要设置一个初始值 否则会崩溃,因为KVC找不到Key
2.KVC函数调用小结:
(1)是OC的方法,运行时给对象发送消息,所以发消息前要保证对象已经实例化完成,因此调用KVC方法前 先要super.init,如上面代码
(2)private 属性 【KVC时 属性不能为private的】
*/
便利构造函数:关键字 convenience
convenience init?(name :String, age: Int) {
if age > 100 {
return nil
}
//1.实例化当前对象
self.init()
//2.访问对象属性 设置值
self.name = name
self.age = age
}
/**
1.允许返回nil 正常函数一定会创建对象
--判断给定的参数条件是否符合,不符合就返回nil,不会创建对象,减少内存开销
2.只有便利构造函数中使用self.init 构造当前对象
--convenience
3.访问对象的当前属性 一定在 self.init之后
*/
析构函数
deinit {//析构函数 类似于dealloc
/**
1.通知
2.KVO
3.NSTimer/CADisplayLink
*/
}
/**
1.没有func ---->不让调用
2.没有() ----> 不让重载
3.对象销毁前 自动调用
*/
欢迎指正,共同进步……
网友评论