利用 Swift Generic 建置可重複使用的 UITableViewController!
TableView Controller 是一個不可或缺的 UIKit 元件,幾乎每個 iOS App 都會用到它來顯示列表中的數據集合。當我們想要在 UITableViewController 中顯示不同類型的數據時,通常都會創建一個新的子類來顯示相關類型的數據。這種方法可行沒錯,但如果我們的 App 中有許多不同類型的數據,則可能導致重複和維護困難。...
View Article你也可以自訂搖動還原 (Shake to Undo) 的功能?一起來拆解並實作吧!
在 iOS 上編輯內容的時候,如果要還原或重做步驟的話,通常可以透過搖動來呼叫出一個還原的警告: 這個搖動還原 (Shake to Undo) 功能在 UITextView 或者 UITextField 等文字編輯的 view 上是內建的,但大多數其他的 view 都沒有預設實作。還好,UIKit 其實已經幫我們做好了從動作偵測到顯示警告的部分,我們只需要提供第一響應者 (First...
View Article善用 Xcode Instruments 來最佳化程式碼 大大提高 App 效能!
世界上還有些頑固的人,拒絕使用如物件導向程式設計 (Object-Oriented Programming)(特別是繼承 (Inheritance) 與多型 (Polymorphism))、協定 (Protocol) 和協定導向程式設計 (Protocol-Oriented Programming)(特別是組合 (Composition))、泛型 (Generics) 與閉包 (Closures)...
View Article實作無限分頁滾動視圖 (Scroll View) 為使用者帶來更完美的體驗和設計
所有 App 的成功,都取決於使用者是否常用這個 App(使用者留存率高 High User Retention),而成功的使用者體驗 (UX) 和界面設計對留存率就非常重要了!在設計 App 的時候,我們需要確保使用者可以利用最小限度而直覺的操作,來達到他們的目的;而且,這操作最好是一個吸引又有趣的過程。這次的教學就是希望利用客製化 UI,來達到上述的目標。 記得從這裡下載我們的範例專案。...
View ArticleMassive View Controller 重構:透過依賴注入 (Dependency Injection) 減輕職責
View Controller 可以說是 iOS 開發裡的核心物件。這不只是因為它佔據了 MVC (Model-View-Controller) 中的中心位置 Controller,還因為 UIKit 團隊有意推動場景導向的設計。UIKit 本身是以當時的 AppKit 為基礎,針對行動系統所重新設計出來的一個框架。在原本的 AppKit 裡面,MVC 基本上是以視窗為單位的,以...
View Article設計多執行緒 (Multi-Threaded) App 處理連續的資料流量更有效率!
身為一名在汽車產業裡的 iOS 開發者,我花了不少時間處理即時資料。現今許多 App 都需要有效率地處理連續的資料流量,為了確保不會卡住使用者介面,你很可能需要使用多執行緒來開發。 處理即時的資料流量非常有趣,因為你會不斷收到可以用來更新視覺畫面的新資料。這也是開發時最困難、最令人沮喪的事情,因為 iOS 裝置有一些硬體上的限制。幸運的是,Apple 透過非常容易使用的 GCD (Grand...
View ArticleLine Chatbot: 使用 ngrok 開發 LINE 應聲蟲聊天機器人
大約從 2016 年 4 月開始,我們逐漸意識到,將通訊軟體(例如 Facebook Messenger 和 LINE)化身為服務入口,免開網頁、免下載 App,而聊天對象也由真人改為自動應答機器人,也許是個不錯的主意。當時 Facebook 在 F8 開發者大會上宣布將旗下的 Messenger 平台化,也就是允許聊天對象不是真人,而是一個用程式寫的、具備應答能力的服務,統稱為聊天機器人...
View ArticleFunction Naming 指南:適當為函式命名 讓程式碼更簡潔清晰
在本篇教程中,我們將探討一個在編寫函式時經常遇到的問題:我該如何命名這個函式呢? 雖然這個問題看起來很簡單,但作為軟體開發人員,適當地命名函式對我們職涯非常重要。下文我們將會看到,適當地命名函式可以讓 code base 更清晰、更易於使用。 簡潔 API 的重要性 如果你要使用第三方套件中的函式,比如說要創建 FancyLabel,你會選擇以下哪個方法來命名函式?...
View ArticleMassive View Controller 重構:Coordinator 模式與 Flow Controller
在上一篇文章中,我們用了依賴注入的技巧,來將 View Controller 與 Model Manager 之間的耦合解開。然而,View Controller 的依賴並不只是這樣而已,View Controller 與 View Controller 之間的依賴更為常見。 比如說,當要在 View Controller 之間傳遞資料的時候,Apple 會告訴我們要這樣寫:...
View Article利用 Protocol Extension 減少重覆的 Code 大大增強 Code 的維護性
對任何程式開發來說,減少重覆的 code,把權責明確分開,讓 code 維護性變好,是非常重要的課題。同樣功能的 code,如果分散在程式的各個角落,不但改功能時很有可能會漏改或改錯,而且要找到某個功能確切的擺放位置也會非常困難;這些都會讓開發成本變得非常高,也會讓開發所需要的時間變得難以估計。...
View Article深入解析 Promises 輕鬆控制 Parallel Programming (平行程式設計)
並行 (concurrency) 的概念與我們日常開發工作越來越息息相關。在上兩篇文章中(Swift 平行程式設計:基礎 (Basic)、操作 (Operations)),我們已經探討過 Apple 所提供的工具。這次,我們將重點放在非官方所支援的工具上。 讓我們回顧一下: 並行 (concurrency) 是指在同一時間執行工作的能力。...
View ArticleMassive View Controller 重構: Swift Extension 整理術
Extension 是 Swift 裡用來延伸既有型別的東西。透過 Extension,當我們想為某個型別加功能的時候,就可以不用把新的功能寫在該型別的主體裡面。比如說,如果我們想為 Cat 增加一個 purr() 方法的時候,可以這樣寫: [crayon-5c930c6d909b5876838357/] 這種能力讓我們可以為一些碰不到原始碼的型別,加上我們自己給的功能。這也就是所謂的回顧式建模...
View Article好好利用 Swift Protocols 簡單增進程式碼的可測試性
對開發者來說,讓程式碼達到高度的可測試性可以說是一大挑戰。測試是非常有用的,可以確保你撰寫的程式碼運作起來符合需求,而且在添加新功能時也不會發生問題。同時,在一個團隊裡工作時,會有很多人修改程式碼,所以確保程式碼的完整度 (integrity) 也是很重要的。...
View Article利用 Container View Controller 拆開職責 視圖控制器不再複雜又臃腫!
視圖控制器 (View Controller) 這個元件提供基本構建塊,作為我們在 iOS 開發中構建 App 的基礎。在 Apple MVC 世界中,它是視圖 (View) 和模型 (Model) 之間的橋樑,充當兩者之間的協調者。控制器是一個觀察者,針對模型的更改作回應,然後更新視圖;並從使用 Target Action 的視圖接受用戶操作,然後更新模型。 (圖片來源:Apple Inc.)...
View Article使用 Swift 實作基於堆積的優先權佇列 大幅改善演算法的時間複雜度
電腦科學中存在著許多問題,而其中,使用優先權佇列 (Priority Queue) 作為底層資料結構,就可以大幅改善演算法 (algorithm) 的時間複雜度。其中一個例子就是 Dijkstra 的最短路徑演算法,該演算法就使用優先權佇列在圖形中搜尋兩個頂點之間的最短路徑。 但不幸的是,Swift 標準函式庫並沒有包含優先權佇列的實作,因此我們將深入了解如何自己實現基於堆積 (heap)...
View Article擷取佈局回饋循環 (Layout Feedback Loop) 解決記憶體耗盡問題
試想像這樣的一個情境:你的 App 非常成功,不但有許多使用者、並有 100% 未當機率 (Crash-free rate)。你非常開心,生活也棒極了。但在某個時間點,你開始在 App Store 上看到負評,說你的 App 經常閃退;但查閱 Fabric 卻沒有新的閃退訊息出現。哪是甚麼情況呢? 答案是記憶體用盡 (OOM, Out of Memory) 而終止。 當你用完使用者裝置上的 RAM...
View Article簡單而強大的 Drag and Drop API 讓你輕鬆建立屬於自己的 Trello App
當建構一個讓使用者在螢幕上移動數據的 App 時,拖放 (Drag and Drop) 就是一種很自然的使用者交互 (User Interaction)。這樣的互動方式在 Trello、Jira 等相關 App 中廣泛使用,以在版面之間移動數據。 在 iOS 11 發佈之前,以拖放互動方式來建立一個 iOS app 並不是簡單。以我過往的經驗來說,我們會要手動實作許多乏味的步驟,像是:...
View Article以編程方式使用 Auto Layout 讓你直覺又簡單地設計 App UI!
Auto Layout ㄧ直是 iOS 必學的技術之一,在 iOS 中你可以選擇使用 Storyboard 設置 Auto Layout,好處是非常直覺,而且多人使用時好懂,就算不大會 Swift / OC 都可以很容易做出想要的版面。最近公司面試需要出題,我也選擇了這個 Layout 題目。 為什麼喜歡用 Code Auto Layout? 對我而言,我比較喜歡 Code Auto Layout...
View Article初探 Flutter :使用單一程式碼輕鬆建立 iOS 及 Android App!
歡迎閱讀我第一篇 Flutter 教學文章。我之前從未寫過跨平台或 Hybrid App 框架的文章,不過 Flutter 改變了我的想法。 過去我用過 React Native、Cordova、Phone Gap、Ionic 來開發 App,這些對我來說真的蠻夠用的,直到我發現了 Flutter,以及其龐大的開發者社群和案例 App。 甚麼是 Flutter? 簡單來說,Flutter...
View Article客製化 NotificationCenter 讓你使用起來更簡單
觀察者模式是一個常見、而且歷史悠久的程式設計模式,而在 Swift 裡,它主要是以通知與通知中心 (NotificationCenter) 的形式存在的。簡單來說,物件可以去向通知中心註冊,成為某一種通知事件的觀察者,然後當有人向通知中心送出通知的時候,通知中心就會去找它的註冊表裡面,所有有註冊這個通知類型的觀察者,並將通知傳送給它們。 通知中心模式跟 Target-action 模式與...
View Article