我想撰寫一個視圖擴展,在當前視圖上應用多個陰影效果。為此,我想在給定的影子配置陣列上使用 reduce 函式。
我的代碼如下所示:
func shadowEffects(_ shadowConfigs: [Double]) -> some View {
shadowConfigs.reduce(self) { currentView, shadowConfig in
currentView.shadow(
color: .red,
radius: shadowConfig
)
}
}
但這會導致無法將 'some View' 型別的值轉換為閉包結果型別 'Self'。
我可以在 AnyView 中解決這個問題,但這對我來說似乎不是一個好的解決方案。因為我總是處理相同的型別。
func shadowEffects(_ shadowConfigs: [Double]) -> some View {
shadowConfigs.reduce(AnyView(self)) { currentView, shadowConfig in
AnyView(currentView.shadow(
color: .red,
radius: shadowConfig
))
}
}
我有什么選擇?
uj5u.com熱心網友回復:
問題是當你宣告一個回傳方法時some View,它需要在編譯時知道采用View協議的實際具體回傳型別(例如Text、Button、Vstack等)。在您的示例中self,您的方法中的型別View是協議,因此編譯器無法確定具體型別,因此無法確定錯誤。
不幸的是,沒有簡單的解決方案。AnyView第一種是像你一樣使用型別擦除。由于AnyView是一個實際的物體,編譯器可以決議底層的回傳型別。第二種是將您的擴展直接添加到 View 協議的每個采用者(文本、按鈕、Vstack 等)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519895.html
標籤:迅速仿制药迅捷减少
上一篇:如何創建我的泛型型別的泛型?
