Swift3.0 -- 反射機制Demo&動態呼叫名稱空間

viiimaus發表於2017-02-13
//
//  AppDelegate.swift
//  fanshejizhi

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    /**
     1.知道 Swift 名稱空間
        -在同一個名稱空間下,全域性共享!
        -第三方框架使用 Swift 如果直接拖到專案中,從屬同一個名稱空間,很有可能衝突!
        -儘量用 cocoapod
     2.反射機制,團隊開發中使用,為了解耦
        -反射機制,工廠方法
        -一個簡單的功能會寫的很複雜
        -封裝的很好,彈性很大
     */
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // *** 程式碼中的 ? 都是 “可選解包”,傳送訊息,不參與計算
        // 所有的 ? 都是 xcode 自動新增的!
        //1.例項化 window
        window = UIWindow();
        window?.backgroundColor = UIColor.white;
        
        // --- 輸出 info.plist
        print(Bundle.main.infoDictionary as Any);
        //1.因為字典是可選的,所以先解包,再取值
        //  如果字典為 nil , 就不取值
        //2.通過key從字典取值,如果錯了就沒有值了
        let ns = Bundle.main.infoDictionary?["CFBundleName"] as? String ?? "";
        
        //2.設定根控制器,需要新增名稱空間 -> 預設就是專案名稱(最好不要有數字和特殊符號)
        let claName = ns + "." + "ViewController";
        //anyclass -> 檢視控制器型別
        let cls = NSClassFromString(claName) as? UIViewController.Type;
        
        //使用類建立檢視控制器
        let vc = cls?.init();
        //        let vc = ViewController();
        
        window?.rootViewController = vc;
        
        //3.讓window可見
        window?.makeKeyAndVisible();
        return true
    }
}


相關文章