Swift3.0 -- 建構函式

viiimaus發表於2017-02-15
//
//  ViewController.swift

import UIKit

/**
 在swift中,同一個專案中(同一個名稱空間),所有的類預設都是共享的,不需要引用,可以直接訪問,不需要import
 所有物件的屬性 var,也可以直接訪問到
 */

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //例項化一個類
        // () -> alloc init
//        let p = Person.init(name: "老王");
        
//        print(p.name);
        let p = Student(name: "老王", num: "10");
        print("\(p.name + p.num)");
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

//
//  Person.swift

import UIKit
/**
 1. 建構函式的目的,給自己的屬性分配空間並設定初始值
 2. 呼叫父類的構造方法之前,需要給本類的屬性設定初始值
 3. 呼叫父類的建構函式,給父類的屬性分配空間設定初始值
    NSObject 沒有屬性,只有一個成員變數 “isa”
 4. 如果過載建構函式以後,並沒有實現父類方法 init(),系統不再提供init()(預設會有)
  - 因為,預設的建構函式不能給本累的屬性分配空間
 */

class Person: NSObject {

    var name: String
    
    // 重寫  父類有這個方法,需要擴充套件
    override init() {
        // 問題1:name所有的初始值都是 zhang!
        name = "zhang";
        print("Person init");

        super.init();
    }
    
    // 過載  函式名相同,引數和個數不同
    // 給自己的屬性,在外部設定值
    // oc沒有過載
    init(name: String) {
        self.name = name;
        super.init();
    }
    
}
//
//  Student.swift

import UIKit

class Student: Person {
    var num: String;
    
    init(name: String, num: String) {
        self.num = num;
        
        //呼叫父類的建構函式,給name初始化
        super.init(name: name);
    }
}


相關文章