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)")
}
}
// 若是子類沒有實現便利構造函數,調用方一樣可使用 父類的 便利構造函數,實例化子類對象
// 便利構造函數,不能被繼承,也不能被重寫!