老司機 iOS 週報,只為你呈現有價值的資訊。
你也可以為這個專案出一份力,如果發現有價值的資訊、文章、工具等可以到 Issues 裡提給我們,我們會盡快處理。記得寫上推薦的理由哦。有建議和意見也歡迎到 Issues 提出。
話題
? ? 關於 Swift ABI 穩定
遲到三年的 ABI 穩定終於要來了。
蘋果釋出了 ABI Stability and More 和 Evolving Swift On Apple Platforms After ABI Stability 兩篇文章來闡述 Swift 5 釋出以後 ABI 相關的內容所帶來的改變。看不懂英文的也不要怕,細心的喵神幫我們做了一個很棒的總結: Swift ABI 穩定對我們到底意味著什麼。
Swift ABI 可以說是 Swift 的一個里程碑事件,讓跨平臺的能力更上了一層,但是 Swift ABI 對於 iOS 開發者使用來說,影響不是很大,有很多開發者誤把 API 穩定當成了 Swift ABI 穩定。對於開發者來說,只有 API 穩定了,才是真正意義上的不需要遷移適配了。
如果不知道 Swift ABI 是什麼的朋友,可以看看蘋果去年釋出的 Swift ABI Stability Manifesto。同時 泊學 也做了一個很棒的翻譯版: 譯:Swift ABI (一) 和 譯:Swift ABI (二)。
最後,關於 Swift ABI,你有什麼看法,可以在我們的 Github Issue 上,發表你的看法,與週報編輯一起討論。
新聞
Swift 5.1 釋出計劃
Swift 團隊近日在部落格裡更新了 5.1 的釋出計劃,這個版本的主要目標是達成 Module Stability,簡單的說就是 Module 介面的向前相容。
另外知識小集也在第一時間進行了翻譯,推薦閱讀這一篇。
It’s time to stop using index(of:)
SE-0204
在 Swift 4.2
實現
- 增加
lastIndex(of:)
- 增加
lastIndex(where:)
index(of:)
改名firstIndex(of:)
,並且廢棄原方法index(where:)
改名firstIndex(where:)
,並且廢棄原方法
文章
? ? Swift5 新特性 @dynamicCallable 帶來的動態魔法
一年前週報的第一期我們曾經提過:Swift 快要可以和 Python 無縫互動了,一年後的今天伴隨著 Swift5 新特性 @dynamicCallable
的釋出,『用 Swift 寫 Python 變成現實』。
起源是 Chris Lattner 大神的兩個提案:@dynamicMemberLookup
提供動態查詢成員的能力(Swift4.2),@dynamicCallable
則提供動態方法呼叫的能力(Swift5)。很難想象,兩個語法糖重新定義語言動態性,讓人看到 Swift 成為膠水語言的可能。
下面三篇系列文章帶我們感受語法糖帶來的神奇魔法:
-
#1 Unix Tools as Swift Functions
一層薄薄的封裝讓所有 Unix Tools 變成 Swfit 方法,提供這樣的呼叫方式:
shell.env()
,shell.ls("-a", "-l")
,shell.python("--version")
; -
基於 @dynamicCallable 輕鬆實現一套 Swift - Objective-C 的橋接。實現思路類似 PyObjC
-
為模板語言Mustache的生成器提供簡潔優雅的呼叫方式。
相關閱讀:細說 Swift 4.2 新特性:Dynamic Member Lookup
? ? 架構師思維
架構師一詞聽起來就是個很高階的 Title,在職業生涯的多數時候,在我心裡都是高山仰止般的存在。儘管不同的公司對架構師的要求也許不一樣,但印象中應該都是技術特別出眾的人。那除了技術出眾之外,又應該具備什麼樣的架構師思維呢?本文作者從開發者和開發兩個方向闡述了什麼才是架構師思維,值得去細細揣摩,帶著這個思維,也許你會有新的發現和努力的方向。
? Behind the Proposal — SE-0200 Enhancing String Literals Delimiters to Support Raw Text
SE-0200
提案中增強字串分隔符支援原始文字的能力。
-
支援多行,並且同時具備Swift原有的字串功能(如插值),示例:
""" line1 \(line2) """
-
為了覆蓋邊轉義字元緣特殊情況,參考了
Rust
的設計,支援自定義分隔符宣告原始字串,同時支援插值。#""#
是將原本\
轉義分隔符修改為\#
。#"\#(val))"#
,等同於以往的\(val)
。#"\n"#
輸出\n
。###"\nline"###
,轉義分隔符是"\####"
,輸出\nline
。
? Swift 5 Exclusivity Enforcement
在 2017 年初,Swift 社群發了一篇長文介紹 Swift 4 將在記憶體安全方面做一些改進,@onevcat 翻譯了此文 所有權宣言 - Swift 官方文章 Ownership Manifesto 譯文評註版 建議細讀。
上文中提到的改變大多已在 Swift 4.x 落地,即將釋出的 Swift 5 中,對「獨佔性訪問」進行了增強:在 Release 模式執行也預設開啟。
Swift 4 中,只有 Debug 模式下,Runtime 會做「獨佔性訪問」的檢查(編譯時 Debug 與 Release 都會檢查,但編譯檢查可能覆蓋不全),Swift 5 中, Release 模式 Runtime 也預設開啟(可手動關閉)。文章仔細介紹了這個改變可能帶來什麼問題,以及如何應對。
? How many apps use Swift in 2019?
文章作者對 App Store 上美區 Top 110 的 App 進行了分析,來看到底有多少 App 使用了 Swift。結果上看,目前 Top 110 的 App 使用 Swift 和未使用 Swift 基本處於對半開的狀態。
大公司切換 Swift 和小公司切換 Swift 比起來,難度要大很多,所以對於這樣的結果,也不算驚訝。希望再過一年,Swift 的比例能夠有進一步的增長,畢竟 ABI 穩定了。
? Painless UI Testing in iOS: Mocking the Network
本文是 Painless UI Testing in iOS 系列的第一篇文章。該系列打算介紹三種方法來讓 UI 測試變得更快更可靠。第一種在本文做了介紹,第二種是在第二篇介紹的 Stubbing the Navigation。但是該系列的第三篇還沒有釋出,大家可以關注他們的技術部落格 eGym Software Development。本系列的作者按設計思路附上程式碼的方式把他的想法分享的很詳細,是非常值得學習和借鑑的,熱衷 UI 測試的同學不可錯過。
? ? Deep Diving React Native Debugging
在開發 React Native 應用時,我們可以通過開啟 Debug JS Remotely
來實現在 Chrome 中除錯 JS,包括斷點除錯、檢視堆疊資訊、變數狀態等,有時候我們可能還會在除錯時遇到紅屏錯誤 Runtime is not ready. Make sure your packager server is running.
,但是不知道這背後都發生了什麼。我們往往對這些每天日常開發中接觸的東西既熟悉又陌生,不妨跟著這篇文章讀讀原始碼並除錯一下,一切都將豁然開朗。
由 @ShannonChenCHN 推薦。
? 分析一次有意思的需求——HTML 程式碼注入
在 iOS Hybrid APP 開發中我們經常會有這樣的需求: 通過 WebView 實現 JavaScript 與 Objective-c 互動。本文作者以 WKWebView 訪問了一個 HTML 頁面,獲取使用者的所有輸入資訊這樣的問題為例,將需求拆解為如下幾部分,最終解決問題。
- HTML 和原生互動
- HTML 獲取指定元素
- 通過 JavaScript 動態為 HTML 元素新增事件
- 通過 WKWebView 向 HTML 注入 JavaScript 並呼叫 原生程式碼
作者通過逐步拆解需求,把抽象的問題分解成各個小問題的組合,然後逐個分析驗證,最終解決相對複雜的問題。其實這正是如何分析具體的需求,並將其轉換為程式碼的一個過程,感興趣的讀者可以跟著作者思路讀一讀,應該會有所啟發。
由 @chouheiwa 推薦。
? How I failed 39 interviews and what I’ve learned
一個大學計算機系二年級在校生從 39 次面試失敗經歷中的總結,對於大部分軟體開發工作者而言,去一些大廠工作都是一個目標。作者打小就夢想進入 Google Facebook 等這些大廠工作,而這篇文章總結了他在校期間面試大廠屢戰屢敗、屢敗屢戰的經歷。 老司機推薦給大家,希望給正在努力亦或是正在迷茫的你有所幫助。
? Demystifying UIKit Spring Animations
Spring 彈簧動畫從 iOS 7 開始就成為了公開 API,但當時的 damping-duration 介面非常不自然,iOS 10 釋出 UISpringTimingParameters
和 UIViewPropertyAnimator
之後有所好轉,但要製作出優秀的彈簧動畫仍然不是一件容易的事。這篇文章會為你介紹究竟什麼是彈簧動畫、背後的工作原理以及如何除錯出恰到好處的動畫。
? Swift 5 字串插值之美
本譯文介紹了 String 型別對 ExpressibleByStringInterpolation
協議的三種擴充套件實現,以精確控制字串插值的列印方式。ExpressibleByStringInterpolation
協議在 Swift 3 時被廢棄,如今被以一種更優雅、擴充套件性更強的方式重新實現。建議同時閱讀一下 SE-0228 這個提案,對比了解下新舊兩種實現方式,以及新的實現方式所帶來的可擴充套件性和效能改進。也可以看下 HTML,LocalizableString,SQLiteStatement 三種非 String 型別的擴充套件實現。
? 唯品會 iOS 程式碼覆蓋率的應用實踐
在快速迭代的這個軟體開發生態下,量化測試資料成為軟體測試中必不可少的一步。
本篇中,作者將一步步剖析,iOS 程式碼覆蓋率的應用。文中的主要步驟可以拆分成一下幾個部分。
- 在編譯過程中,利用 LLVM 可以使用 gcda/gcno 記錄程式碼覆蓋率的特性,進行中間程式碼插樁
- 在程式執行過程中,將記錄檔案刷入記憶體當中,利用 HTTP 介面上傳伺服器
- 將 LCOV 作為記錄檔案分析工具,生成視覺化的報表資料
相較於傳統的行/函式/分支覆蓋率外,文中新增了行差異覆蓋率。將覆蓋率檔案進行預處理,新增差異程式碼行數相關屬性,達到支援差異/多版本合併。
如果對於 GCC 插樁想要有所瞭解可以看這個博主的一系列研究 連結
工具
? Introducing the sourcekitd Stress Tester
Sourcekitd 是為 Xcode 和最近釋出的 SourceKit-LSP 的編輯器核心功能提供資料支援的工具。如 Swift 檔案的程式碼補全,語法高亮和重構等。為了幫助改善其健壯性,本文介紹了一個新引入的工具,即 “Sourcekitd 壓力測試工具”。在過去幾個月中,它幫助找到了 91 個可復現的 Sourcekitd 崩潰,斷言失敗和掛起。 這篇文章介紹了 Sourcekitd 的實現,如何在 Swift CI 和 PR 測試中部署,以及 Swift 開發人員如何在自己的專案中執行它,以幫助改善每個人的 Swift 編輯體驗。
程式碼
? MicroKernel
MicroKernel 是一個客戶端微核心架構,它把業務和基礎都視作外掛,形成一個外掛化微核心架構。對於業務,一切其他模組的業務和基礎都是注入的依賴。
MicroKernel 遵守了整潔架構 (clean architecture)、六邊形架構 (hexagonal architecture) 等架構的主旨,架構以程式碼變更的原因和頻率形成邊界和層次。
分為以下幾個層次:
- MicroKernel:App的驅動,提供MicroApplication管理、通訊機制、依賴注入、路由等。
- MicroKernelService:貫穿App的基礎能力服務,提供基礎能力的領域抽象,不包括具體的技術選型,不必拘泥於依賴注入形式。
- MicroApplicationService:貫穿App的業務服務,從複用角度聚合,包括其整體業務方案,比如,分享、登入、支付等。
- MicroApplicationCoordinator:解開MicroApplication之間耦合的協調器。
- MicroApplication:獨立的業務,從功能角度聚合,在架構中稱作應用,其形式包括Native、H5、Hybrid、小程式等。
- MainApplication:整個App的架構註冊、配置,以及外部渠道的對接。
MicroKernelDemo 是作者通過模擬一個簡單的業務場景,以幫助讀者熟悉 MicroKernel 背後的概念和使用的實踐 demo。
Aiolos
Aiolos 是一個受浮動皮膚啟發的 Swift UI 框架,已在 iOS 11 中的地圖應用中引入。它完全由手勢驅動,並自動響應螢幕鍵盤,與許多其他開源皮膚解決方案相比,Aiolos 被設計為始終可見的子檢視控制器,因此不使用 iOS 的自定義檢視控制器轉換 API。可通過 Carthage 整合到專案中,使用簡單便捷,感興趣的同學可以嘗試一下。
EasyTransitions
EasyTransitions 是一個簡單易用的轉場動畫庫,可以幫助開發人員使用協議中定義的簡單函式建立自定義互動式轉換,避免使用 UIKit 中的多個轉換 API 進行實現的麻煩。
特性
- 自定義過渡簡單設定
- 支援模態演示,UIPresentationController 和 UINavigationController 過渡
- 具有多個平移手勢方向的 1 行中的互動式轉換支援
- 3 個自定義轉換作為示例
- iOS 和 tvOS
EasyTransitions 庫很實用,有需要感興趣的讀者可以看看,不過該庫只提供了 swift 版本哦!
音視訊
Swift Community Podcast #3 - Result Type, Character Literals and Swift Evolution
Swift Community Podcast 是 Swift 開源社群舉辦的討論 Swift 語言特性與應用的電臺節目,基本可以認為是 Swift 的官方 Podcast,第三期的主持人是 Swift 之父:Chris Lattner, 還有兩位嘉賓:提出了 Result type,同時也是 Alamofire 維護者之一的 Jon Shier,以及Kelvin Ma,目前還是一名在校學生。三個人首先討論了 Swift 的開源歷史,有哪些重要的時間節點,然後從 Swift 的錯誤處理的前世今生開始聊,引出了 Result type 的必要性。最後也討論了 Character Literals 提案的一些趣事。整體氛圍比較輕鬆,尤其是 Jon Shier 吐字非常清楚,非常適合英文不太好的同學(比如我)聽。基本都能聽懂。
ggtalk | 2019 準備學什麼新技術?
作為積極上進,互相攀比只有攀比學習的 iOS 圈,想必 iOS 程式設計師們最關心的話題的就是 9102 年,我們到底應該學什麼。當然這個話題是因人而異的,ggtalk 這期節目邀請了 SwiftGG 翻譯組的蓉老師和蓮叔,和幫主一起聊了各自在 9102 年的學習計劃,可以提供一定的參考給廣大學習焦慮的 iOS 同學。
內推
-
上海-小紅書-高階/資深/專家 iOS開發&架構:參與小紅書App日常功能/架構 (APM \ Crash \ Security) 開發與維護;業務高速成長中, 團隊年輕活潑, 技術氛圍濃厚, 座標上海市中心新天地地鐵口。推薦或簡歷可直接發到 cli2@xiaohongshu.com。
-
北京-百度網盤 持續招 iOS 開發:社招、應屆、實習均可。專案在技術上很有挑戰性,團隊技術氛圍極好。誠心希望各路大神前來切磋,也歡迎計算機基礎好的小白來共同學習。簡歷發郵箱 xuyafei01@baidu.com,暫不考慮的也歡迎微博私信 @小非86 聊聊~
-
北京-螞蟻金服 招iOS/安卓/前端開發:負責支付寶會員及帳號業務線,地點北京國貿,金臺夕照地鐵站出口 100 米。有興趣的同學歡迎將簡歷傳送到:weijing.wdf@alibaba-inc.com / weijing.wdf@antfin.com (同一個郵箱)或者微博私信 @折騰範兒_味精 瞭解情況。
-
上海即刻:如果你認識聰明勤奮、膽大心細、有追求的工程師,那就來加入我們吧!任何推薦或簡歷可直接發給 Jason(即刻 iOS leader): jasy@okjike.com,或微博 @JasonYuh。
-
杭州奇志科技招聘 iOS、前端:奇志科技自 2016 年起通過行業無人機協同工作流 Mesh 進入物聯網與人工智慧領域, 併成功為房地產、建築、測繪、電力巡檢等行業提供無人機解決方案。感興趣可以微博上私信 @沒故事的卓同學 瞭解。
-
深圳頭條研發中心誠招各路 iOS 好手一起做取悅自己的專案:如想了解更多深圳頭條的資訊,可以加小T微信:tomtan,切磋技術和聊情懷都可以喔~~~~
-
北京位元組跳動 iOS 團隊持續招人中:簡歷可以傳送到郵箱 raozhizhen@gmail.com,或者新增我(@AidenRao)的微信 jingmu1994 瞭解更多公司及崗位資訊。
-
北京百度教育事業部招 iOS 開發:百度教育事業部,地點:北京西二旗。部門下面有百度閱讀,百度文庫,百度愛聽等 App 產品。團隊技術氛圍濃厚,有興趣的同學歡迎將簡歷傳送到我的郵箱:lizelei@baidu.com。
-
深圳 - 格隆匯 iOS / Android / 前端:公司方向是投研資訊,目前正在穩步擴張中,各個級別的工程師都有需求。任何推薦或者簡歷都可以傳送到我郵箱:chenkem@gmail.com,同時也歡迎大家私信我瞭解更多資訊。
關注我們
我們開通了公眾號,每期釋出時公眾號(OldDriverWeekly)會推送訊息,歡迎關注。
同時也支援了 RSS 訂閱:github.com/SwiftOldDri… 。
本期編輯
@四娘,@享耳先森,@Damonwong,@折騰範兒_味精,@張嘉夫,@Parsifal,@aaaron7,@kyo,@tom510230,@anotheren,@水水,@looping,@老老老老老老老驢,@小非86,@邦ben,@紅紙,@含笑飲砒霜,@JimQ,@老峰,@zvving,@J_Knight_
說明
? 表示需翻牆,? 表示編輯推薦
預計閱讀時間:? 很快就能讀完(1 - 10 mins);? 中等 (10 - 20 mins);? 慢(20+ mins)