mein

一般常說,SwiftUI學習曲線起始陡峭,克服難關之後,工作效率將大幅提升。

自今年五月因疫情限制活動,而投注在SwiftUI的學習以及app開發,目前已經完成三個app,其中第三個 app 用於回顧這六個月來的開發進展,順便觀察SwiftUI的學習曲線。

這個 app 使用的是GitHub OAuth認證與授權,讀取GitHub API的資料。因為我在Xcode的程式碼的source control是簽入到GitHub的私人repository,所以透過GitHub API就可以讀到自己的專案的統計紀錄。然後再把統計紀錄轉換成圖表,便呈現如下。

直條圖是以週為單位,一共 24 週(約六個月),每個直條代表該週的程式異動行數,藍色代表增加的行數,橘色代表刪除的行數(在git的統計上,更新一行程式碼,會被記為增加一行新的程式碼,同時刪除一行舊的程式碼)。灰色的折線圖則代表running total,也就是程式碼的淨增加量,加總顯示於最右方。

第一個 app (TW Tide),也就是開始學習SwiftUI的時候,其實蠻挫折的,常常卡關,不知道怎麼解決的時候就會停頓下來,明顯反映在好幾個禮拜的程式碼完全沒有異動。當時最主要的問題是卡在 SwiftUI 的 State 變數(@State, @Binding, @ObservedObject 等等),不當使用會導致程式出現各種難以解釋的奇怪行為,最常見的是畫面上張冠李戴,例如地圖上點選台北的時候,程式回應為花蓮。後來總算漸漸弄懂了,並把已知的bug都清乾淨。

第二個 app(Watch Mask),使用了CloudKit與CoreData,這真是蠻複雜的一個組合,按照 Apple 的說法,CoreData可以放在 CloudKit上,但實作上有些難解的問題,尤其是在資料同步、資料衝突處理上,一直搞不定,不確定 Apple 的範例程式碼是否能適用在現實的情境中,最後我決定自己寫一套資料同步的方式,也就是雲端的資料儲存在 CloudKit,以支援跨裝置的資料同步,但本機端的資料儲存在 CoreData,這樣一來只需要介接 CoreData 與 CloudKit 之間的同步就可以。這個主要的問題解決之後,後續就容易多了,回顧時看到每週異動的資料行數竟呈現遞增的現象,蠻有趣的。

第三個 app(vHub)就開始漸入佳境了,竟然只花了兩個禮拜就開發完成。一方面是因為 GitHub API 的使用者眾多,範例程式多,文件完整,另一方面大概也是終於過了 SwiftUI 學習曲線最陡峭的階段了。雖然在 CoreData 作為 State 變數方面,還是學到一些新的教訓,但碰到的問題並不棘手,debug的時候也能很快找到原因。簡單的說,以 State 變數傳遞 CoreData 到不同的 View的時候,要注意是否會刪除這個 NSManagedObject ,若會,則 State 變數可能會取到無效的 property ,我的解決方式是不要使用 State 變數傳遞 CoreData 的物件,而在個別的 View 上面各自以 FetchRequest 讀取 CoreData 就能確保讀到正確的資料。

這三個app分別使用的 Swift、SwiftUI模組如下:

vHub目前在 TestFlight 開放 beta test ,你也可以用這個方式觀看自己的repository 或是開放原始碼的專案。TestFlight上的測試版本不會對 in-app 購買項目有任何扣款,所以可以把全部的功能都「購買」使用。

雖然蘋果和橘子是不能比較的,但我還是把一些大型的開源專案找來測測我的 app,看看他們的時間軸發展進程。可以看到近幾年 Swift 專案穩定成長中,而每個大型專案動輒都是幾百萬行的程式碼累積。我覺得這真是當代的巴別塔奇觀。希望有一天我也能對開放原始碼的社群有所貢獻。

--

--

https://apps.apple.com/app/id1590637517

Apple Watch的錶面一共數十種,你使用過幾種呢?通常一隻手就算的出來。為什麼這麼少呢?因為切換錶面加上調校需要多花一些功夫。如果切換錶面變得更容易,那麼Apple Watch將更有發揮,想像這樣的未來「There is a watch face for every task.」

目前切換Apple Watch錶面的方式只有兩種:

  1. 直接在Apple Watch錶面上長按,進入編輯模式
  2. 透過iPhone的Watch app編輯錶面

但若想把之前辛辛苦苦設定好的錶面再找回來套用,你只能從歷史清單中左右滑動直到找到為止。既不能為自己的錶面命名、不能分類存放、不能搜尋,也不能區分使用時機。

有的錶面只是用來嚐鮮把玩一下,但有的錶面是你的最愛,會把每個細節都調整到最適合的樣子,不只是顏色與色調,還有每個元件(complication)要擺放什麼資訊。可是,不管是花時間調校過的錶面,還是一次試用的錶面,以現有的機制,它們全被一視同仁的並排在左右滑動的清單中。

Watch Mask是為了解決這個問題而設計的。源自前一個app設計了放在錶面的潮汐元件,越想像越發現可以放入錶面的元件還有很多,那麼一個錶面當然裝不下,應該要有很多錶面,各自有不同的用途,搭載不同的元件。只要很容易切換錶面,使用者就可以設定好特定用途的錶面,需要的時候再即時切換。就像把Apple Watch當成迷你數位儀表板使用。

所以著手設計其他錶面元件以前,我決定先做這個錶面管理的app。命名為Watch Mask,概念是「變臉像換面具(或口罩)一樣容易」。你只需要將調校好的錶面分享到Watch Mask,就可以編輯名稱、加上標籤或打星號。並且隨時要切換錶面的時候只需按鈕一按就切換了。

--

--