convenience - 便利构造函数

convenience - 便利构造函数

  • 默认情况下,所有的构造方法都是指定构造函数 Designated

  • convenience 关键字修饰的构造方法就是便利构造函数

  • 便利构造函数具有以下特点:

    • 可以返回 nil

    • 只有便利构造函数中可以调用 self.init()

    • 便利构造函数不能被重写或者 super

/// `便利构造函数`////// - parameter name: 姓名/// - parameter age:  年龄////// - returns: Person 对象,如果年龄过小或者过大,返回 nilconvenience init?(name: String, age: Int) {    if age < 20 || age > 100 {        return nil
    }    self.init(dict: ["name": name, "age": age])
}

注意:在 Xcode 中,输入 self.init 时没有智能提示

便利构造函数应用场景

  • 根据给定参数判断是否创建对象,而不像指定构造函数那样必须要实例化一个对象出来

  • 在实际开发中,可以对已有类的构造函数进行扩展,利用便利构造函数,简化对象的创建

构造函数小结

  • 指定构造函数必须调用其直接父类的的指定构造函数(除非没有父类)

  • 便利构造函数必须调用同一类中定义的其他指定构造函数或者用 self. 的方式调用父类的便利构造函数

  • 便利构造函数可以返回 nil

  • 便利构造函数不能被继承



//  Person.swift

import UIKit


class Person: NSObject {

    

    // 对象的属性就是应该可变的

    // 可选项,允许变量为空,var 的默认值就是 nil

    // iOS 开发中,所有的属性是延迟加载的

    var name: String?

    

    // age KVC 不兼容,OCInt属于基本数据类型,不存在 `nil` 的概念

    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: AnyObject]) {


        super.init()

        // KVC 的设置数值

        setValuesForKeysWithDictionary(dict)

    }

    

    override func setValue(value: AnyObject?, forKey key: String) {

        print("forKey \(key) - \(value)")

        

        super.setValue(value, forKey: key)

    }

    override func setValue(value: AnyObject?, forUndefinedKey key: String) {

        print("forUndefinedKey \(key) \(value)")

    }

}


//  ViewController.swift


import UIKit


class ViewController: UIViewController {


    override func viewDidLoad() {

        super.viewDidLoad()

        

        let p = Student(name: "zhangsan", age: 90)


        // 解包使用 ? 表示如果 p nil,不继续调用后续的属性或者方法

        print("\(p?.name) --- \(p?.age)")


    }


}


// 如果子类没有实现便利构造函数,调用方同样可以使用 父类的 便利构造函数,实例化子类对象

// 便利构造函数,不能被继承,也不能被重写!

convenience - 便利构造函数_第1张图片

你可能感兴趣的:(convenience - 便利构造函数)