1. 程式人生 > >swift 自定義類的建構函式,有參構造、無參構造

swift 自定義類的建構函式,有參構造、無參構造

import UIKit

class person : NSObject {
    var name : String?
    var age : Int = 0
    
    //1.重寫父類的初始化方法
    override init(){
        //在建構函式中,如果沒有明確呼叫super.init(),那麼系統會自動幫你呼叫super.init()
        super.init()
        
        print("-------")
    }
    
    //2.自定義建構函式,直接追加引數
    init(name:String , age:Int) {
        self.name = name
        self.age = age
    }
    /*
    //3.1自定義建構函式,使用字典作為引數   (第一種方法)
    init(dict : [String:Any]) {
        let tempName1 = dict["name"] //此時得到的tempName1是Any?任意的可選型別
        let tempAge1 = dict["age"] //此時得到的tempAge1是Any? 任意的可選型別
        //as?最終轉成的型別是一個可選型別
        //as!最終轉成的型別是一個確定型別
        let tempName2 = tempName1 as? String //此時得到的tempName2是String? 字串的任意型別
        name = tempName2 //swift是強型別語言,只有相同的型別才可以賦值
        
        //第一種age賦值方法,不安全如果字典中沒有傳age引數會崩潰
        //let tempAge2 = tempAge1 as! Int //此時得到的tempAge2是Int Int型別
        //age = tempAge2 //swift是強型別語言,只有相同的型別才可以賦值
        
        
        //第二種age賦值方法,如果字典中沒有傳age引數不會造成崩潰
        if let tempAge = tempAge1 as? Int {//先把任意可選型別轉化成Int?可選型別,再使用可選繫結拿到int值
            
            self.age = tempAge
        }
    }*/
    
    
    //3.2自定義建構函式,使用字典作為引數   (第二種方法)
    init(dict:[String:Any]) {
        super.init()
        setValuesForKeys(dict)
    }
    
    
    //避免字典引數中傳的引數在類中沒有定義相應的屬性造成崩潰,重寫此方法
    override func setValue(_ value: Any?, forUndefinedKey key: String) {
        
    }
    
    
}

//建立person物件
let p1 = person()

//使用有參構造建立person物件
let p2 = person(name:"zhengyanfeng" , age:18)

print(p2.name!,p2.age)

//使用以字典為引數的有參構造建立物件
let p3 = person(dict: ["name":"zhengyanfeng","age":17,"height":1.88])

print(p3.name! , p3.age)