便利构造函数

1. 说明:

  1.1 能够提供条件检测

  1.2 能够允许返回 nil,默认(指定)的构造函数,必须要创建对象

  1.3 便利构造函数,必须在条件检测完成之后,以 self. 的方式调用其他的构造函数,创建对象

  1.4 能够简化对象的创建方法

2. 创建 Person.swift 对象

/**
   构造函数
   1.给属性分配空间
   2.设置初始数值
 
   重载: OC 中没有重载的概念
   函数名相同,参数的个数&类型不同,叫做重载,是面向对象设计语言必备标志
   OC 中使用 initWithXXX的方式 替代重载
 */
class Person: NSObject {
    //对象的属性应该是可变的
    //可选项,允许变量为空,var 的默认值就是 nil
    
    //在 iOS 开发中,所有的属性是延时加载的
    //因为 KVC 是 OC 中的特性,所以要加 @objc 修饰,否则会报错
    //super.init 结束后,name 并不会被分配空间
    @objc var name: String?
    //age 和 KVC 不兼容,OC中 Int 属于基本数据类型,不存在 nil 的概念
    //对于基本数据类型,KVC 不会主动调用"构造函数",因此,如果要对基本数据类型,使用KVC设置数值,必须指定初始值,空间已经分配完成
    @objc var age: Int = 0
    
    //构造函数中,如果出现 ?,表示这个构造函数不一定会创建出对象
    //convenience - 便利构造函数 作用
    //1.能够提供条件检测
    //2.能够允许返回 nil,默认(指定)的构造函数,必须要创建对象
    //3.便利构造函数,必须在条件检测完成之后,以 self. 的方式调用其他的构造函数,创建对象
    //4.能够简化对象的创建方法
    convenience init?(name: String, age: Int){
        if age < 0 || age > 100 {
            //不能创建对象
            return nil
        }
        
        //调用其他的构造函数初始化属性 在一个构造函数中调用了另外一个构造函数
        self.init(dict: ["name":name, "age": age])
    }
    
    // KVC 的构造函数,用字典设置模型
    init(dict: [String: Any]) {

        //setValue:forKey 说明:
        //1.当给对象发送 setValue:forKey:消息时
        //2.会判断属性是否已经被“实例化”
        //3.如果没有被实例化 1.调用属性对象的构造函数实例化属性 2.设置数值
        //4.如果已经分配了空间,直接设置数值
        //设置数值 - 调用 super.init 保证对象已经被创建完成
        //KVC 是 OC 特有的,本质是在运行时,动态的给对象发送 'setValue:forKey:' 消息
        super.init()
        
        //KVC 的设置数值
        setValuesForKeys(dict)
        //dict : 会有多个值对 会顺序调用 setValue forKey 给对象的属性设置数值
    }

  override func setValue(_ value: Any?, forKey key: String) {
        print("forKey \(key) \(value)")
        //如果对象存在key对应的属性,直接设置数值
        //如果对象不存在 key 对应的属性,则调用undefinedKey方法
        //undefinedKey方法 默认崩溃 重写没事
        super.setValue(value, forKey: key)
    }
    
    //默认的 setValueforUndefinedKey 方法 如果出现未定义的key会抛出'NSUndefinedKeyException'异常,让程序崩溃
    //如果一旦重写了此方法,同时不 super,不调用父类默认的方法
    override func setValue(_ value: Any?, forUndefinedKey key: String) {
        print("forUndefinedKey \(key) \(value)")
    }
}

3. 调用函数

 func demo(){
        //po self
        //let p = Person(dict: ["name": "xiaoxiao", "age": 19, "title": "Test", "no": "007"])
        let p = Person(name: "u u", age: 90)
        //解包使用 ? 表示如果 P 为 nil,不继续调用后续的属性或者方法
        print("\(p?.name) \(p?.age)")
        //print("\(p.name) \(p.age) \(p.no)"))
    }

4. 子类继承便利构造函数

  4.1 创建 Student.swift 类对象 并继承 Person.swift

 //如果子类没有实现父类的方法,在执行时,会直接调用父类的方法
  class Student: Person {
   
    //学号
    @objc var no: String?
    
    //如果子类没有实现便利构造函数,调用方同样可以使用 父类的 便利构造函数,实例化子类对象
    //便利构造函数,不能被继承,也不能被重写
    }

  4.2 调用函数

func demo(){
        //po self
        //let p = Person(dict: ["name": "xiaoxiao", "age": 19, "title": "Test", "no": "007"])
        //let p = Person(name: "u u", age: 90)
         let p = Student(name: "xiao xiao", age: 17)
        //解包使用 ? 表示如果 P 为 nil,不继续调用后续的属性或者方法
        print("\(p?.name) \(p?.age) \(p?.no)")
        //print("\(p.name) \(p.age) \(p.no)"))
    }

5. dealloc 对象释放的方法 deinit

  5.1 没有func

  5.2 没有() --> 不允许重载,不允许带参数,不允许直接调用,在系统内部自动调用

  5.3 实现方法,在 Person.swift 中实现

    //与 dealloc 类似,主要是负责对象被销毁之前的内存释放工作
    /**
       1.没有func
       2.没有() --> 不允许重载,不允许带参数,不允许直接调用,在系统内部自动调用
        
       在实际开发中,哪些内容需要被销毁
       - 通知 : 不注销,不会崩溃
       - KVO:  不注销,会崩溃
       - NSTimer: 会对 target (self), 进行强引用
     */
    deinit {
        print("Person deinit")
    }

  5.4 实现方法,在 Student.swift 中实现,并继承 Person.swift

 deinit {
        print("Student deinit")
    }

  5.5 调用函数

func demo(){
        //po self
        //let p = Person(dict: ["name": "xiaoxiao", "age": 19, "title": "Test", "no": "007"])
        //let p = Person(name: "u u", age: 90)
        let p = Student(name: "xiao xiao", age: 17)
        //解包使用 ? 表示如果 P 为 nil,不继续调用后续的属性或者方法
        //print("\(p?.name) \(p?.age)")
        print("\(p?.name) \(p?.age) \(p?.no)")
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hanyang Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值