Swift 入門指南 V1.00 - 單元 21 - 新增 Cocoa 專案




新增 Cocoa 專案 (project) 同樣由選單列〔File〕的〔New〕找到〔Project...〕,然後點擊這個指令



接著出現專案選擇視窗,這次選擇 Cocoa Application ,這是 Mac OS 的應用程式介面,最後點擊右下方的〔Next〕



接著出現專案名稱的視窗,這裡我們在 Product Name: 輸入 EncryptorMacOS ,其他選項採預設值就好,最後點擊右下角的〔Next〕



接著選擇專案的儲存位置,我們仍是放在 _code 資料夾中,最後點擊右下角的〔Create〕



進入專案後的第一個畫面如下



這跟命令列專案有些不一樣,我們都先採預設值就好了。切換到 AppDelegate.swift ,如下



除了 import Cocoa 之外,先看到 @NSApplicationMain 的標記,這個標記是告訴 Xcode 下面的 AppDelegate 類別 (class) 是專案執行的起始點,因此執行 EncroptorMacOS 的時候,等同系統自動建立 AppDelegate 的物件 (object) ,然後去執行這個物件的方法 (method) 。


AppDelegate 後面加上了冒號,其後以逗號區隔接了 NSObjectNSApplicationDelegateNSObject 是 Swift 中最基礎的物件類別,這是從 Objective-C 程式庫 (library) 沿用的類別,冒號是繼承 (inheritance) 的意思,因此 AppDelegate 會得到所有 NSObject 的屬性與方法。


繼承是物件導向程式設計的特性之一,子類別 (subclass) 可繼承父類別 (superclass) 的屬性與方法,這讓多個子類別能夠有共通的特性,而不需要在每個子類別逐一定義相同的屬性 (property) 與方法。

關於繼承一詞的英文為 inherit ,中文意思泛指從什麼得到什麼,因此遺傳也是用 inherit ,至於繼承的中文本意跟先人有關,先人往往指已經過世的人。程式語言社群習慣把 inherit 翻成「繼承」,可是這裡並沒有 NSObject 已死的觀念,事實上 NSObject 在程式執行中一直存在。

NSApplicationDelegate 則是 Cocoa 中的協定 (protocol) , Swift 不允許多重繼承,卻可以實作多個協定。協定本身並不會實際定義屬性或實作方法,也就是說協定是類別的共通規格,詳細內容則由實作該協定的類別來定義。


因此 AppDelegate 繼承了 NSObject ,又實作 NSApplicationDelegate ,底下兩個 applicationDidFinishLaunching()applicationWillTerminate() 則是 NSApplicationDelegate 中宣告的方法,預設沒有內容,功能如其名,前者是應用程式完成載入後執行,後者則是應用程式即將結束時執行。


NSObject 的細節請參考 NSObject Class ReferenceNSApplicationDelegate 的細節請參考 NSApplicationDelegate Protocol Reference

依我們開發 EncryptorMacOS 的需求,這裡 AppDelegate.swift 保留預設即可。接著切換到 ViewController.swift



ViewController 類別繼承自 NSViewController ,這是控制圖形介面與使用者互動的類別,像是使用者按了個按鈕後,程式該如何反應都定義在這個類別中。按開發 GUI 軟體的 MVC 模式, ViewController 就是 C 的部分。


所謂 MVC 的 M 是 Model ,也就是資料處理模型,我們採用的 M 就是 Encrypt 類別, V 為 View ,也就是軟體外觀,這由下一單元的 Storyboard 來設計。

下面兩個標記為 override 的方法,這兩個都是父類別 NSViewController 就有定義的方法, override 的意思就是改寫父類別原有的方法,專案預設要改寫,倒是我們不需要更動內容,就保留預設的程式碼就可以了。


NSViewController 的細節請參考 NSViewController Class Reference

先點擊左上方的執行鍵看看預設的 GUI 是怎麼樣的囉



預設是空白的視窗,下一個單元我們切換到 Main.storyboard ,開始來設計我們需要的視窗外觀。


中英文術語對照


專案project
類別class
物件object
方法method
程式庫library
繼承inheritance
子類別subclass
父類別superclass
屬性property
協定protocol

沒有留言: