老司機 iOS 週報 #43 | 2018-11-12

老司機iOS週報發表於2019-03-04

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

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

小專欄

From Swift To C++

來自微信團隊的週報編輯芒果最新出爐的一篇文章。這篇文章按照程式設計正規化(programming paradigm)來組織脈絡,從一個客戶端工程師的角度來品味和對比這 Swift 和 C++ 兩門語言。如果你也在或者即將同時把 Swift 和 C++ 當做主流程式語言,那麼這篇文章你絕對值得一看。

新聞

適用於觸控問題的 iPhone X 螢幕模組更換計劃

號外!號外!繼“降頻門”事件引起的 218 元換電池服務後,蘋果又出免費更換 iPhone X 螢幕服務了。只要你的 iPhone X 經過測試滿足以下兩個問題,則蘋果會替你免費更換螢幕。

  • 螢幕或螢幕的一部分不響應或間歇響應觸控操作。
  • 即使沒有進行觸控操作,螢幕也會作出反應。

另外友情提醒,218 元換電池只剩最後一個半月了,還沒換的小夥伴抓緊上,絕對能讓你的老裝置煥然一新!

文章

? ? Language Server Protocol

前段時間 Apple Swift 團隊在 Swift Forum 上宣佈他們會對 Swift 和 C 系列語言(C/C++/ObjC)增加 LSP (Language Server Protocol)支援。這對於飽受 Xcode 折磨的開發者來說是個極大的利好,意味著在這之後可以有更多的第三方 IDE 支援。

Matt 的這篇文章,解釋了什麼是 LSP,LSP 是怎麼工作的,以及潛在的可能帶來的好處。

雖然 Swift 支援 LSP 的具體時間表到現在還沒有放出來,但是受苦於 Xcode 的大夥們也算是有點盼頭了。

? ? Tricks & treats to make UI testing less terrifying

part1part2part3

自動化測試,尤其是 UI 的自動化測試,對於國內大部分的開發者應該都是“只聞其聲未見其人”的感覺,知道有這麼個事兒,但基本都沒怎麼實踐過。這一系列文章系統性的討論了 UI 自動化測試的最佳實踐。從如何標記 UI 元素到如何訪問,最後在第三部分還探討了一種編寫 UI 測試的“設計模式”,名叫 PageObject 的程式設計模型,來提升 UI 測試程式碼的可維護性。

? Stephen King's Advice To Software Developers

斯蒂芬·金,《肖申克的救贖》的作者。他曾在《On Writing》一書說,講述了他的寫作經驗。學習技巧基本相通,因此本文作者將斯蒂芬·金的經驗融合到軟體開發例項中。

  1. 多輸入,多輸出
    • 多輸入:多看原始碼,CodeReview,部落格,書籍,如無從做起,可多關注老司機週報
    • 多輸出:對於想掌握的技巧,多進行刻意練習。
  2. 避免分心
    • 規劃時間,固定的時間做固定的事情,效率更高。
    • 尋找專門的空間和可以集中精神的 2 個小時
  3. 閉門,開門
    • 專注開發完成後(閉門),接受 CodeReview 或者開源,吸納更多的意見進行優化(開門)。
  4. 殺掉你的所愛
    • 每次優化,果斷刪掉你自豪但無用的程式碼,炫技不如貼合業務。
  5. 花時間
    • 沒有捷徑,務必堅持(但是要注意學習技巧)。

? ? How to remove duplication from Swift tests with helper functions

對於 XCTest 的單元測試來說,提取重複程式碼對於開發者而言並不友好,可能會出現如下幾種問題:

  1. 執行過程中,Xcode 的斷言函式停止在了提取函式內部。
  2. 多個單元測試同時報錯時,需要展開錯誤資訊才能瞭解到具體資訊。

為了解決如上幾個問題,作者巧妙的運用了 Swift 中 XCAssert 函式的另外兩個入參 fileline,來傳遞輔助函式呼叫時的檔案和行號,這樣 Xcode 就能夠幫助你將錯誤資訊正確提示到輔助函式呼叫的地方。

? Keeping your code clean

寫得一手好字,對於普通人來講是一個很好的加分項,而是否寫得一手簡潔漂亮的程式碼則對於我們開發者來說更為重要。招聘單位往往對應聘人的程式碼風格都會有一定要求。本文分享瞭如何寫得一手好程式碼的幾個小技巧,很值得大家關注,並在平常開發中重視起來。

  • LOC(Lines Of Code):程式碼應該足夠精簡,函式是最小的執行單元,避免冗長的程式碼集中在一個函式實現上。
  • 正確的縮排:不管你是 “Tab” 黨還是 “空格” 黨,合適的縮排能讓你的程式碼排版更加整齊,讓人讀起來更加舒適。
  • 標準的命名:雖然命名一直是程式設計師的難題,但我們仍然需要能夠很好的名字來提高我們程式碼可讀性。
  • 變數和函式的宣告:在合適的地方做宣告,按照功能進行分組。
  • 程式碼風格:每個團隊都應該有一套程式碼規範,來統一團隊成員的程式碼風格。

另外,該作者還在最後為我們推薦了幾個 Lint 的工具,可以幫助我們自動化程式碼規範稽核,如 SonarQubeTailor 以及 SwiftLint

? String’s ABI and UTF-8

近日,Michael Ilseman 在 Swift 社群論壇發文 String’s ABI and UTF-8 表示 String ABI 相關改動已提交到 master 分支。具體來說,這是底層實現的一次顯著改動(這些改動在 API 層面無任何影響),其中最主要的一點就是原生 Swift 字串會統一使用 UTF-8 進行儲存(在記憶體裡),而之前是根據內容選擇 ASCII 或者 UTF-16 進行儲存。

文章還特地提到:傳統意義上中文字串是 UTF-8 效能最差的場景(需對多個 UTF-8 編碼進行重排合併得到 Unicode 碼位),得益於現代 CPU 的改進,這些已不再是問題。

? Result<T> 還是 Result<T, E: Error>

API 的錯誤處理一直是 Cocoa 做的不好的一部分。到了 Swift 時代,我們有了更好用的 enum,可以幫助我們統一 Data 與 Error 的封裝。如果你常用 Alamofire,一定對它的 Result<T> 非常熟悉,對於錯誤,它僅要求滿足 Swift.Error。但是很多時候處理這個空協議依舊不是最方便。於是又有人提出了 Result<T, E: Error> 來指定錯誤型別,大部分情況下你會在這裡定義一個 enum 來窮舉所有可能的錯誤(注意這裡的錯誤是 Error 而非 Swift.Error)。喵神在文中詳細對比了這兩種方式的利弊。

當然,官方不可能對這一不足置之不理,相關的提案 SE-0235: Add Result to the Standard Library 本週已經在討論中,相信結果很快就會出來,讓我們拭目以待。

? KVC/KVO 總結

對 KVC / KVO 做了到位的總結和程式碼示例。相信對想要詳細瞭解或使用 KVC / KVO 的同學會有所幫助。

KVC

  • Key-Value Coding基本原則
  • 訪問物件屬性
  • 訪問集合屬性
  • 訪問者搜尋模式

KVO

  • 註冊KVO
  • 相容KVO
  • 註冊從屬keys
  • Key-Value Observing 的實現細節

? Category 特性在 iOS 元件化中的應用與管控

關於元件化,在業界的文章和討論已經很多了。但元件化其實是一個比較大的工程化問題,對於想要使用和已經採用元件化進行開發的團隊來說,對於實施元件化的很多細節,其實很多文章並沒有說的很清晰。本文主要圍繞元件分層通訊解耦的機制,先後列舉了常見的幾種方案對比,以及美團所採用的方案:Category+NSInvocation 和 CategoryCoverOrigin。對於這兩個相對陌生一些的方案,文中也有一定的介紹,並且寫了實際運用的程式碼,對此有興趣的同學推薦可以認真看一下本文。最後,Category 的使用筆者一向認為需要比較慎重,否則往往會帶來更壞的效果,至於採用哪種方案,就看大家自己的抉擇了。這裡並沒有打太極的意思,而是對於元件分層通訊,怎麼做、是否要做到如此,以及各種方案所帶來的程式碼量的增加和後期的維護成本是否值得,不同的團隊也會有不同的見解。

? Void

NSHipster 介紹了很多和 Nothingness 相關的內容。這篇文章主要介紹的是 Swift 中的 Void。文章內容依舊是 Mattt 大神的寫作三部曲:

  • Void 在標準庫中的運用

    描述了 Swift 標準庫在設計 ExpressibleByNilLiteral 的時候,如何巧妙的運用 Void 避免了和預設 init 衝突的情況。

  • Void 一些被忽略的細節

    比如 Void 是一個 non-nominal 型別,如何在無法擴充的情況下如何相互比較、一些自相矛盾的寫法等

  • Void 實際開發中的秒用

    以網路請求為例,在使用 Void 的情況下,巧妙的把 completion(.success(())) 改成了 completion(.success)

? Swift Tip: Lightweight Observation

對於靜態檢視結構和動態資料,我們可以使用內建的 didSet 屬性觀察器來觀察資料的變更,並對應更新檢視。這項技術的優勢就在於簡單性:不需要引入響應式框架、KVO 或其他東西。這篇文章用一個實際的例子演示了具體的做法。

? Swift 5 and ABI stability

Swift 5 的分支最近已經準備要合併到主幹了,這一次合併意味著 ABI 在 Release 之前不會有大改動,並且在未來版本保持 ABI 的向後相容性。

所以最近在 Swift 論壇上也能看到核心團隊加快節奏在調整精簡標準庫的 API,包括加入 Contiguous Collection Protocols 確立陣列記憶體佈局以便優化排序等操作,去除掉 Sequence.SubSequence 以便提升陣列切片效率等等。

如果你還不瞭解 ABI 相關的內容,那麼可以看看這篇文章,瞭解一下 ABI 穩定對我們日常開發的影響。

? 【譯】給 iOS 開發者介紹 Flutter

本文是 Flutter for iOS 官方指南的翻譯。iOS 知識和技能對 Flutter 開發非常有價值,如果你已經有 iOS 開發經驗,可以通過這篇文章,用自己已有的 iOS 知識去使用 Flutter 構建應用。

文章主要介紹 UIView、UIViewController 等 iOS 常見知識在 Flutter 中怎樣使用。共包含 12 個章節:View、頁面導航、執行緒和非同步、工程結構/本地化/依賴和資源、ViewController、佈局、手勢檢測和 Touch 事件處理、主題和文字、表單輸入、與硬體互動/第三方服務和平臺、資料庫和本地儲存、通知。

作為給 iOS 開發者的入門 Flutter 的文章,本文內容全面,也可以作為開發手冊來查閱。另外,作者還翻譯了 給 Android 開發者介紹 Flutter,有興趣可以閱讀。

設計

Photopea: advanced image editor

Photopea 是一款免費的線上 Photoshop(替代品),擁有和 PS 幾乎相同的介面和快捷鍵,並且支援多語言,已經有超過 150 萬獨立訪客。

工具

手機上的抓包神器 Stream

配置簡單,不需要改代理等繁瑣操作,即可

  1. 抓取手機上的 HTTP & HTTPS 請求和響應,方便開發和測試人員快速定位線上問題。

  2. 重放和構建請求,高效除錯服務端介面。

  3. 支援在 iOS 上實現配置 Hosts 的效果,方便產品和測試切換線上和測試環境。

  4. 整合一些常用工具,如 URL Decode/Encode,md5,base64,時間戳轉化等。

另一款輕量級的 UI 實時除錯工具 - Sherlock

這是除 Reveal 外又一款支援實時除錯 UI 的工具,相比於 Reveal,Sherlock 雖然沒有 Reveal 那麼強大的功能,但它更加輕量級,且無需任何配置,開啟模擬器和 Sherlock 就可以直接使用。此外,它還支援調整螢幕大小以測試你的 UI 在各類螢幕上的展示效果,不需要你去啟動各種模擬器。目前 Sherlock 正處於 Beta 測試中,暫時只支援 iPhone 模擬器。

SmartBaby

SmartBaby 是一款提高 Swift 開發者效率的工具。它能從 JSON 推斷出 Codable 模型,且具有好用的自定義功能。建立的模型可按照 Project 分組,並使用 CloudKit 儲存在 iCloud 的私有資料庫中。

由 SmartBaby 開發者 @nixzhu 自薦

程式碼

AloeStackView

AloeStackView 是一個類似垂直 UITableView 的類。它著重於讓 UI 的實現變得非常的快速、簡單和直接。不過為了實現更簡單、更安全的API,它放棄了 UITababieView 的一些特性,如檢視迴圈。

特性

  • 允許您保持對檢視的強引用並動態更改其屬性,而自動佈局讓 UI 實時更新。
  • 允許檢視動態新增、刪除、隱藏和顯示,並提供可選動畫。
  • 包括對檢視間可定製分隔符的內建支援。
  • 提供可擴充套件的 API ,允許新增專用功能而無需修改 AloeStackView 本身。
  • 在高流量的 iOS 應用程式中廣泛使用和審查。
  • 小的、易於理解的程式碼庫(在500行程式碼之下)沒有外部依賴性,除錯輕鬆。

音視訊

LEARN TALKS AWESOME CONFERENCE AND MEETUP TALK

顧名思義,learntalks 是一個學習如何 talk 的網站,面向技術人員。網站收錄了技術領域時下熱門的技術大會的演講視訊,其語言涵蓋了 Swift,Kotlin, Javascript 等,頗有一種足不出戶就能閱遍天下大會的感覺,學技術和學 talk 同時進行。推薦關注。

Flutter 免費視訊教程第一季:開發環境搭建

手把手帶你配置 Flutter 開發環境的視訊教程,除視訊外作者還編寫了非常詳盡的文字教程,對正在入坑 Flutter 的小夥伴可以看看。

內推

關注我們

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

老司機 iOS 週報 #43 | 2018-11-12

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

本期編輯

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

說明

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

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

相關文章