希望一切平安但我還是想放假QQ
颱風前夕青菜到處都找不到QQ
今天繼續研究昨天翻到的專案,關於 DeviceActivityReport 的 entrypoint 其實藏在 MonitorReport 裡面,這個 struct 的性質是 DeviceActivityReportExtension。
DeviceActivityReportExtension 的 body 必須要是 DeviceActivityReportScene,而 DeviceActivityReportScene 的類型則是 AppExtensionScene。DeviceActivityReportExtension 內,context 是上下文設定, configuration 記載了配置資料, makeConfiguration 接收了 DeviceActivityData 並進行數據轉換,content 則根據配置進行渲染。
public protocol DeviceActivityReportScene : AppExtensionScene {
var context: DeviceActivityReport.Context { get }
associatedtype Configuration
func makeConfiguration(representing data: DeviceActivityResults<DeviceActivityData>) async -> Self.Configuration
@ViewBuilder var content: (Self.Configuration) -> Self.Content { get }
}
在 MonitorReport 中應該有一部份是需要額外實作的,要拿到 report data 然後丟進 view 裡面,否則就會 default (直接載下來這樣)除了標題一片空白。
底下的 TotalActivityReportScene 是 DeviceActivityReportScene 的實現,當中設定了 context 以及 content,而 makeConfiguration 則是處理了 DeviceActivityResults 並進行轉換。
在 TotalActivityReport 當中有用到了 closure 的寫法,閉包和匿名函式有點類似,但可以獲取外部變量的值並使用,也可以直接被當成參數傳遞。swift 中還有提供一些簡寫,像是省略類型,直接用 $0、$1 來傳遞參數並進行計算等。