convenience - 便利构造函数web
默认状况下,全部的构造方法都是指定构造函数 Designated
swift
convenience
关键字修饰的构造方法就是便利构造函数ide
便利构造函数具备如下特色:函数
能够返回 nil
spa
只有便利构造函数中能够调用 self.init()
3d
便利构造函数不能被重写
或者 super
code
/// `便利构造函数`/// /// - parameter name: 姓名 /// - parameter age: 年龄/// /// - returns: Person 对象,若是年龄太小或者过大,返回 nil convenience init?(name: String, age: Int) { if age < 20 || age > 100 { return nil } self.init(dict: ["name": name, "age": age]) }
注意:在 Xcode 中,输入
self.init
时没有智能提示orm
根据给定参数判断是否建立对象,而不像指定构造函数那样必需要实例化一个对象出来对象
在实际开发中,能够对已有类的构造函数进行扩展,利用便利构造函数,简化对象的建立继承
指定构造函数必须调用其直接父类的的指定构造函数(除非没有父类)
便利构造函数必须调用同一类中定义的其余指定构造函数
或者用 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)")
}
}
// 若是子类没有实现便利构造函数,调用方一样可使用 父类的 便利构造函数,实例化子类对象
// 便利构造函数,不能被继承,也不能被重写!