convenience - 便利構造函數

convenience - 便利構造函數web

  • 默認狀況下,全部的構造方法都是指定構造函數 Designatedswift

  • convenience 關鍵字修飾的構造方法就是便利構造函數ide

  • 便利構造函數具備如下特色:函數

    • 能夠返回 nilspa

    • 只有便利構造函數中能夠調用 self.init()3d

    • 便利構造函數不能被重寫或者 supercode

/// `便利構造函數`///
/// - 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 不兼容,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)")


    }


}


// 若是子類沒有實現便利構造函數,調用方一樣可使用 父類的 便利構造函數,實例化子類對象

// 便利構造函數,不能被繼承,也不能被重寫!

相關文章
相關標籤/搜索