💬 Pofat 的話
這周有很精彩的影片和文章,雖然我有做摘要但內容錯過可惜,非常建議找時間好好地看一下,都是半小時內能看完的內容。
🌎 On Swift Community
Swift Extension for Visual Studio Code
Swift 官方部落格最新文章介紹專門為 Swift Package 打造的 Extension, 個人初體驗的感想是的確很適合開發 Swift Package 、及命令列的執行程式,因為:
同畫面就有可迅速切換的命令列,這很重要
查看變數的型別,自動完成,跳至定義與參考(reference)都沒問題,再搭配 Copilot 大概不得了(還沒用過只能說大概)
測試用的側邊欄也很方便在各測試中來回
Remote Container 套件讓你可以直接在 docker 中開發和測試
挑個好位置:頑皮狗的崗位系統
知名遊戲工作室 Naughty Dog 的開發者 Allen Chou 在 2022 台北遊戲開發者論壇給了一場很精彩的講座,關於敵人移動的策略設計。
內容由位置的設計與評分機制介紹帶出演算法扮演的角色,接下來介紹不同選擇以提昇效能的實例,而且應用上的遊戲我都有玩過(「祕境探險 4」與「最後生還者二部曲」)!過程與面試算法題的流程很像,先暴力法全部都算過分數再選擇,接下來用雜湊、適合表示空間的樹狀結構,以及更積極的 broad phase (儘速決定某群節點是否根本不用算)來減少運算量。
而且這場講座原本預訂在今年三月世界最大的遊戲開發研討會 GDC 發表,因故延到明年,所以中文圈的朋友們有幸先享受,並且全程免費!我看得很過癮,特別把這消息收錄進來分享給大家。
SwiftUI Color 不只是顏色
13 最新一期的 SwiftUI 專欄,告訴你 Color 和你想的不一樣。裡面的技巧非常實用,是我學到後也很常使用的招數,還不趕快了解!
Reverse Engineering SwiftUI’s NavigationPath Codability
Pointfree 發佈了一篇逆向 NavigationPath
encode 與 decode 做法的文章,其中利用到了 Swift 5.7 的 any
,值得一讀。
這個 iOS 16 才有的 SwiftUI 新功能 - ,不只改善了大家一直抱怨的 navigation 用法,還支持將路徑 encode 成一個 JSON 檔、或者從 JSON decode 回來。代表你可以簡單地保存當前畫面與使用者路徑,在下次重啟 app 時回復這一切狀態。
核心挑戰在如何 encode/decode [Any]
。其中保存的 type 資訊在 JSON 裡以字串保存,這裡便利用 _typeByName
來反查型別,接下來 any Encodable
和 any Decodable
就起了妙用,用來檢查能不能 encode 和 decode ,在 5.7 之前我們需要仰賴 AnyCodable 這樣的套件,如今只要 any
就搞定,越來越能感受到其強大之處。
Hang Detection on iOS 16
iOS 16 的新功能,Debug 和 TestFlight 使用者都可以看到自己的報告,偵測到發生的同時還會在螢幕上方跳出個小提示,這大大解決了不少中小型公司常遇到的痛點!這種規模的團隊功能可能已經複雜到會有此類效能問題,但是又不夠人力建立自己的監視機制,要感謝 🍎 爸爸。
🗣️ On Swift Forum
SE-0364: Warning for Retroactive Conformances of External Types in Resilient Libraries (Reviewing)
波報 #5 才提過不要把不是你的物件遵循不是你的 protocol ,這個 SE 就是要為這件事加上警語,以終結編譯器默認但是一直有人上論壇或 Twitter 哭訴的現象。
如果決定風險自負,想叫編譯器安靜的話,只要顯示地註明來源 module 即可 - extension Foundation.Date: Swift.Identifiable { ... }
Approaches for fixed-size arrays (Discussion)
Swift Array 都會自動成長以應使用需求,在不給其它條件下的空間成長策略是直接 double 。而 C 和其它語言則有固定大小的 array,這便是 Swift 實作方案的早期討論。
一個方向是以同型別的 Tuple (T, T, ...)
來代替: 已使用於引入 C 固定尺寸的 array ;再做語法糖以簡化寫下 n 個 T 的宣告方式,並遵循 Collection 以取得 index 或部分切片(slice) 以及大家喜愛的 map
等功能。但是Tuple 有許多特殊行為,數量一大這些問題會更嚴重。好處是簡單,不需要再搞回相容性的問題,語法上也不會有斷層。
另一個方向則是新的型別 struct FixedArray<n: Int, T>
,或者只允許在 struct
或 class
裡使用以 property wrapper 輔助的 BufferView@FixedArray(count: 4, initialValue: 0) var buffer:BufferView<UInt16>
兩者雖都有新的型別,但差別在於後者不是一等公民型別(first class type),不需對外抛頭露臉,因此往前相容的問題便簡單許多。
Opt-in Reflection metadata
這個提案旨在讓 metadata 可以被選擇性地注入,以及改變 Swift 編譯器現在全部注入的預設行為。
Metadata 可以讓我們在 runtime 時得知類型的資訊,SwiftUI 便利用此來達成狀態改變時的重新繪圖。
但這些資訊的注入也會讓檔案變得更大,況且絕大數物件的 metadata 沒有被使用到,沒用到的都只是佔位置。這個提案除了引入 Reflectable
這個標記 protocol 外,還有四種注入模式:全關、只注入 Debug、選擇性注入(遵循 Reflectable
的物件)與全開。
Swift 一直有編譯後檔案尺寸的問題,所以這個改進方向是非常必需。
Inout behaviors
把一個掛有 didSet
的 property 丟入接受 inout
參數的方法,就算啥都沒做,didSet
仍會被觸動。
因為 inout
本身採取的做法是複製一份出來傳給方法修改,改完後再寫回去原本的地方,所以 didSet
就被觸發了。
一個理解原理但沒留心過的事實,從使用者的角度有點不太合乎邏輯,當留心。
🎉 Swift commits
Sema: Allow explicitly available overrides to be as available as their context
修正一個存在許久的小 bug ,在 @available
下 override 條件不同的方法時編譯器會報錯,但如果拿掉顯式的標記(也就只是靠 class 本身傳下來的隱式標記),編譯器就會誤以為可以而放過它。
[Interop][SwiftToCxx] Implement enum case switching
Swift enum 橋接到 C++ 時會自動生成對應的 switch 與是否為各 case 的判斷方法。
Duration: Fix rare overflow trap in Int128.multipliedFullWidth
Duration 內部用的 Int128 在相加時有個 overflow 的 bug。
🤪 Pofat 選推
I know 🥲
再度讚歎 SwiftUI 實在是做 prototype 和以形狀繪圖的好用神器
常被貨運公司摔壞商品的單車品牌想出了妙計...
太狂
最後,本週的 Swift 小猜謎