老司機 iOS 週報 #45 | 2018-11-26

老司機iOS週報發表於2018-11-26

老司機 iOS 週報,只為你呈現有價值的資訊。

你也可以為這個專案出一份力,如果發現有價值的資訊、文章、工具等可以到 Issues 裡提給我們,我們會盡快處理。記得寫上推薦的理由哦。有建議和意見也歡迎到 Issues 提出。

小專欄

Swift 開源專案精選導圖

這份文件主要基於微博 @SwiftLanguage 跟蹤過活躍於 Swift 語言領域的那些 GitHub 開源專案,順便也是對於過去幾年關注的內容進行一次系統化梳理。嘗試整理出一份相對結構化且精練的 Swift 開源專案參考知識庫,它將主要以思維導圖形式呈現。

文章

? ? Hades:移動端靜態分析框架

本文介紹了大眾點評基於 Objective-C 的程式碼靜態分析工具 Hades 的研發經驗,重點解決了以下痛點:

  • 開發成本高,收益有限,研發參與積極性不夠。
  • 針對區域性程式碼分析,跨編譯單元以及全域性性分析較難。
  • 增量分析困難,CI 靜態檢查效率低下。
  • 工具性較強,大部分只作程式碼規範檢查,應用範疇侷限。
  • 接入和維護成本高,難以平臺化。

Hades 相對於市面上已有的工具,在研發端解決了程式碼檢查規則維護困難的問題,在 CI 端解決了效能問題,因為針對每次檢查都可以持久化 Model 物件,在擴充套件性上還有很大的想像空間,大眾點評團隊為我們提供了很好的程式碼靜態分析工具研發思路。目前 Hades 還是閉源階段,將來有可能轉為開源。

P.S. 目前iOS平臺上的程式碼靜態分析工具一覽表 SwiftLint Appscreener Checkmarx Fortify Infer oclint Veracode

? Swift Development with Visual Studio Code

Swift 在早些時候宣佈將支援 LSP(Language Server Protocol),整個社群都沸騰了。人們湧上街頭,奔走相告,一遍遍的確認著:我們可以擺脫 Xcode 了嗎?VSCode 作為 LSP 支援的先驅者與佼佼者,目前基本已經是行業排行第一的通用型程式碼編輯器。

本篇文章由 mattt 大神出品,詳細介紹了怎麼在 VSCode 中配置 Swift 的開發環境。目前雖然 Swift 的 LSP 支援還處於 early stage,但已經可以支援最常用的自動完成、快速幫助以及跳轉定義等功能。並且基於 VScode 強大的外掛生態,還有 SwiftLint 這樣的外掛可以來提升程式碼的風格優化。不得不說,人們對於 Swift,尤其是非 Apple 生態下的 Swift 開發體驗跨越式升級,已經發生。

? ? Xcode and LLDB Advanced Debugging Tutorial

作者準備了一個簡易專案,演示瞭如何利用 Xcode 和 LLDB 進行高階除錯。

  • 第一部分 在斷點處新增除錯命令,注入一行新程式碼進行除錯。

  • 第二部分 通過給屬性新增觀察點,當其變化的時候,會中斷程式,觀察到屬性變化的前後值,及可以進行堆疊追蹤。

  • 第三部分 在斷點中,通過除錯命令新增新的斷點,使斷點在某些場景下才開始執行,更高效的追蹤問題。

? ? A taste of MVVM and Reactive paradigm

本文通過一些簡單的類講述了什麼是 MVC 和 MVVM,以及如何進一步研究 Rx。您可以自由地建立自己的架構,但無論您做什麼,一致性都是關鍵,不要讓別人看的時候感到困惑或驚訝。

所有設計模式的簡單原則可總結為:

  • 確定應用程式的各個方面的變化,並將它們與保持不變的方面分開
  • 程式設計到介面,而不是實現
  • 組合好過繼承

希望本文對正在為架構選型而頭疼的朋友有所幫助。

? 實用的可選項(Optional)擴充套件

OptionSwift 最基礎的內容,它迫使開發者們處理好一些臨界情況,使得程式更加健壯。標準庫中 Option 的 API 非常少,編碼過程中通常需要配合 if let guard let 一起使用,這容易造成多分支。作者參考了 Rust Scala 等語言的實現,給出了一些 Option 擴充套件,或許你可以用於自己的專案中。

? ? Stubbing in pair with Swift compiler

Unit tests 中 stubbing 是一個很常見的做法,現在也有很多成熟的框架。而本文卻從另外一個角度來做: 利用 Swift 的語言特性來做另類的輕量級的 Stubbing。 這種做法的應用面雖然比較有限,但是不妨可以瞭解一下作為參考。

? 關於 performSelector:afterDelay: 的一個坑及思考

本文通過對於 performSelector:afterDelay: 函式進行了研究,總結了以下三點內容:

  1. 在一個沒有開啟 RunLoop 的子執行緒中呼叫 performSelector:afterDelay: 函式,最終是不會被執行的
  2. 看似相近的 API,可能不是同一個模組提供的,其實現方式也不盡相同
    • performSelector: 來自於 NSObject.h,其是有 id 型別的返回值,並不依賴於子執行緒的 RunLoop 開啟狀態
    • performSelector:withObject:afterDelay: 來自於 NSRunloop.h,其並沒有返回值,依賴子執行緒的 RunLoop 開啟狀態
    • performSelectorOnMainThread:withObject:waitUntilDone: 來自於 NSThread.h,其並沒有返回值,依賴主執行緒的 RunLoop 開啟狀態
  3. performSelector: 中函式定義在其他地方就會引起編譯警告,如果函式沒有返回值可以使用 performSelectorOnMainThread: 或者 performSelector:withObject:afterDelay: 來避免編譯警告

? 函數語言程式設計 - 有趣的 Monoid(單位半群)

本文介紹了在函數語言程式設計中比較核心的一個概念 Monoid(單位半群)。從半群到單位半群,從數學定義到 Swift 的展開實現,以引導教學的方式帶領讀者一步步深入瞭解 Monoid,極易消化理解。後半部分介紹了幾個有趣實用的 Monoid 類的資料結構,且都有遞進式的概念講解及 Swift 實現。

另外,本文是近兩年來作者關於函數語言程式設計系列文章中的最新一篇。本系列文章同樣都是採取引導遞進式的行文風格,作者從 Haskell 這種標準化的、通用純函式式的程式語言中汲取靈感,將諸多函數語言程式設計的核心概念改造為 Swift 實現,讓我們從新的角度去認識 Swift 以及 與 Swift 相關的函數語言程式設計思想,Swift 或 函數語言程式設計愛好者不容錯過。

? Unit testing retain cycles

迴圈引用問題會造成記憶體洩露,輕則影響應用效能,重則導致應用閃退,非常影響使用者體驗。同時它也是不太容易被發現的。所以在開發測試過程中,增加對迴圈引用的檢測很有必要。

本文就介紹瞭如何在單元測試中檢查迴圈引用。思路很簡潔,通過建立弱引用去檢測。這樣我們就能保證程式碼庫本身沒有問題,正如文末所說的 “get a level of comfort”。除了檢測方式,作者所表現出的這種為程式碼負責任的態度也是值得我們學習的。

? Self-sizing Table View Cells

這是一個關於 tableview cell 的佈局教程,該本教程中,您將學習如何啟用自動調整大小的 cell ,以及如何使它們按需調整大小並支援動態型別。該教程通過 storyboard 加程式碼的教程形式,一步步完成一個大家常見的 tableview 需求,並附上了專案 demo 。

? Extending optionals in Swift

Swift 裡的 Optional 雖然幫助我們保證了記憶體安全訪問,但在很多情況下都需要我們解包後再進行操作,讓程式碼顯得比較囉嗦而且不連貫。

Sundell 這周就給我們帶來了 Optional 的實用擴充,總結了一些 Optional 常見場景,並且構建對應的語法糖去優化 Optional 的使用。

? Swift Async Operations at Your Command

當一個操作相對比較複雜時,使用 Operation 封裝上下文會是一種比較合理的做法,這篇文章裡作者分別介紹了 Fabric 封裝的 FABAsyncOperation 和 FABCompoundOperation 以及各自的使用場景,並且講述了他在專案中使用 Swift 重寫的過程。

? 關於 Swift defer 的正確使用

在 Swfit 中,defer 關鍵字即為延遲的意思,用 defer 宣告的 block 並不會立刻執行,而是在當前程式碼執行退出後被呼叫,這類似於 JAVA 裡的 try/finally。最近,喵神在重構 Kingfisher 的時候,因為 defer 的使用不但而造成了 bug。為此,喵神完整梳理了下 defer 的特性以及使用方法。

程式碼

30-seconds-of-swift-code

一個立志於讓你 30 秒看懂一段 Swift 程式碼的專案,較為新手向,方便新人快速瞭解 Swift 的內建函式。當然老鳥也不妨一讀,總有你漏掉的知識點。

LINE SDK for iOS Swift

用 Swift 開發的 iOS LINE SDK 可以讓我們用現代化的方式來實現 LINE API,包括使用者認證及通過 OpenID 獲取使用者資訊等功能,為 iOS app 開發有吸引力的、個性化的使用者體驗。

內推

關注我們

我們開通了公眾號,每期釋出時公眾號會推送訊息,歡迎關注。

老司機 iOS 週報 #45 | 2018-11-26

同時也支援了 RSS 訂閱:github.com/SwiftOldDri…

本期編輯

@四娘@享耳先森@Damonwong@折騰範兒_味精@張嘉夫@AidenRao@Parsifal@aaaron7@方秋枋@kyo@tom510230@anotheren@水水@looping@老老老老老老老驢@邦Ben@紅紙@含笑飲砒霜@JimQ

說明

? 表示需翻牆,? 表示編輯推薦

預計閱讀時間:? 很快就能讀完(1 - 10 mins);? 中等 (10 - 20 mins);? 慢(20+ mins)

相關文章