如何解决 Swift 泛型类型转换



我有这样的代码

import SwiftUI
struct TabItemModifier<TabItem>: ViewModifier where TabItem: View {
var tabItem: () -> TabItem
func body(content: Content) -> some View {
return TabItemView(tabItem: tabItem, content: content)
}
}
struct TabItemView<TabItem, Content> : View where Content: View, TabItem : View {
var tabItem: () -> TabItem
var content: Content
var body: some View {
content
}
}

extension View {
func withTabItem<V>(@ViewBuilder _ label: @escaping () -> V) -> some View where V: View{
ModifiedContent(content: self, modifier: TabItemModifier(tabItem: label))
}
}

它应用带有 TabItem 的修饰符,该修饰符应返回某种类型 TabItemView,该类型包含 tabItem 和属性中的内容,并仅呈现内容。

然后在代码的其他地方,我想将视图强制转换为此 TabItemView 以从中访问 tabItem 属性,如下所示:

if let tabbed = views.0 as? TabItemView {
tabItems.append(tabbed.tabItem())
}

但这种选角是不可能的。

更新

我这样改变了它

var body: some View {
MenuView {
Page1()
Page2()
.menuTabItem(tag: 1) {
TabItemView(systemImage: "person", title: "Tab 2")
}

这个视图修改器的新实现非常简单,像这样

func menuTabItem<T>(tag: Int, @ViewBuilder _ tabItem: @escaping () -> T) -> some View
where T: View {
ModifiedContent(content: AnyView(self),
modifier: Click5MenuItemModifier(
tag: tag,
menuItem: nil,
tabItem:  AnyView(tabItem())
)
)
} 

struct MenuItemModifier: ViewModifier {
var tag: Int
var menuItem: AnyView?
var tabItem: AnyView?
func body(content: Content) -> some View {
return content
}
}

但问题是我只能直接在 MenuView 中使用它。在 Page1(( 中使用此修饰符会导致该视图隐藏在 Page1 下,然后在 MenuView 的实现中,我无法使用上面的强制转换访问此修饰符,也没有引用此修饰符链。

TabItemView结构具有两个关联的类型。使用时必须指定具体类型。像...as? TabItemView<Text, Color>.但是,不可能指定不透明类型(View(。所以我的建议是:

TabItemViewcontent更改为AnyView,并保持tabItem的类型与tabItems的类型相同。

相关内容

  • 没有找到相关文章

最新更新