本篇主要提及的內容,主要是談MVC架構,以及針對2–1的Todo-list進行修正後的結果。
前言
這邊有我之前Coding的過程產出的一些小結果,但這是未經mentor CodeReview過的版本,本篇會針對我寫的Todo-list去做一些更動,以及需要注意之處,或許這樣的學習路徑也可以成為有志想成為工程師的夥伴們的相關經驗分享:
這邊也會附上Task#2的連結,讓大家回去看我過去在Todo-list裡面做了些什麼:
這裡也會附上更新過後的連結於下:(在CodeReview後的Todo-list)
正文
Todo-list是我第一個要按照MVC架構去設計的程式練習,但不幸,是有點失敗的,因此可以回去看Stanford CS 193P這個課程的經典影片中,其實提到了MVC的基本概念,影片網址如下:
而其中,有這兩張附圖,原則上幾乎道盡了MVC架構的作用,那麼配合著以下的圖,我也會來稍微描述一下這兩張圖的一些重點。

左邊這張圖基本上就是討論View、Controller、Model的基本關係,在View裡面,主要承載的就是關於「畫面」的所有設定,在本篇章裡面就是Todo-list的TableView的部分。
而Controller裡面,則是包含著事件、資料、以及直接跟畫面溝通的元件。
原則上,這是切的很清楚的概念,我們把畫面(View)的歸畫面、視圖控制器(ViewController)的歸視圖控制器。而因為目前的這個專案沒有很大的規模,所以其實也用不到Model這個東西。

而這張圖主要就是描述在一個程式裡面,會有很多MVC架構的內容互相牽扯在一起,進而構成我們很容易看到的各式App。
不過,這個經典影片的實作我在此處就不贅述了,大家可以慢慢看老師的翻牌教學。
以下,則會根據我在Todo-list中的問題,歸結一下:
我在CodeReview前沒有把Controller、View切得很好,如果看仔細了你會知道,我在MyView這個檔案裡面,放了資料陣列info,它其實應該歸給Controller,而MyView下面有一個從tableViewDelegate、tableViewDataSource,它則應該要歸給Controller,因為它們都涉及了資料的利用。
在Controller裡面的Alert,它被寫死了,mentor提到我在處理這個Alert的時候,可以考慮讓它裡面的資料是可以被暴露的,以方便日後編寫上的使用,因為我們也許可以直接利用這個Alert去做很多我們可能日後都要用上的東西。所以在編寫上,也許可以方便日後的直接利用。
這邊是調整過後的code:

didSelectRowAt(62–67)
這邊的跳出框有一個很直白的作用,這個就是直接點即該列,它就會直接跳出一個編輯框
就是它直接讓info內部的index.row,就等於跳出框要輸入的參數text,所以在textFieldAlert這個閉包裡面,它就有了可以直接輸入的東西。
editActionRowAt(68–88)
這邊也還算有趣,他就是把編輯鈕(70–77)、刪除鈕(80–85)都用閉包寫好,然後把所屬的動作都塞進去。
UIAlertAction
這邊則是做一個跳出框,讓前面的function都可以使用。
這也是一個很重要的設計原則,就是其實做出一個東西後,是要可以重複使用的,不要為了某個特定的功能而寫死某個東西!

屬性觀察器didSet
最後有個蠻重要的部分:didSet的概念有點像是響應式的,它響應了Alert跳出框的指令設置,所以讓didSet直接在這裡面就做了savedata()這件事情,這是自動完成的。所以也可以知道didSet的作用就是響應變化。也因此,大家使用didSet的時候,應該要注意你在didSet裡面到底觀察了什麼。

所以,在上面的例子中,就是對於info這個陣列進行觀察,假若它的值有增加或減少,didSet就會進行響應,讓saveData()進行儲存、tableView.reloadData直接刷新表格。所以再次的證明,didSet本身就是一個動態的觀察器。只要有改變,它就執行你在它內部設置的改變設定。
以上大致是Task2為我帶來的震撼教育。