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 不兼容,OC中Int属于基本数据类型,不存在 `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)")
}
}
// 如果子类没有实现便利构造函数,调用方同样可以使用 父类的 便利构造函数,实例化子类对象
// 便利构造函数,不能被继承,也不能被重写!