我对这样的对象有一个协议:

public protocol Viewable {
    associatedtype Content: View

    var parent: (any Viewable)? { get }
    var body: Content { get }
}

我想要的是在另一个视图中显示视图的主体,如下所示:

public struct SampleView: View {
    
    var object: (any Viewable)?
    
    public var body: some View {
        object!.body 
    }
}

但我收到了一个错误Type 'any View' cannot conform to 'View'

显示协议扩展100中定义的对象的视图的最佳方式是什么?

谢谢.

推荐答案

您的object不能是存在类型(动态类型的协议),因为View的协议要求指定View.Body是泛型的关联类型.

我们需要保留完整的泛型类型信息,以满足bodyViewsome View要求. 答案是使用具体的泛型类型:

public struct SampleView: View {
    
    var object: (some Viewable)?
    
    public var body: some View {
        object!.body 
    }
}

为清楚起见,可以采用更传统的拼写方式,以明确这是您的自定义协议的一般约束类型:

public struct SampleView<T: Viewable>: View {
    
    var object: T?
    
    public var body: some View {
        object!.body
    }
}

这一行为在SE-0309的提案中有更详细的描述,该提案最初允许将存在类型用于任何协议类型.


要仍然以不同的方式使用Viewable个类型(比如在一个数组中),您需要创建一个额外的抽象层,比如创建一个enum,并将具体值作为关联值.

struct SampleView: Viewable { ... }
struct ProfileView: Viewable { ... }
struct PreferencesView: Viewable { ... }

enum Views {
   case sample(SampleView)
   case profile(ProfileView)
   case preferences(PreferencesView)
}

var views = [Views]()

现在,您可以访问关联值中的具体类型. 显然,这种解决方案不能很好地扩展,这种处理泛型类型的方法应该在有限的情况下使用,以避免这enum在许多情况下变得非常大.

Ios相关问答推荐

更新@PersistableEnum时是否需要执行迁移块?

如何在PINCH上添加UITextfield以zoom 图像

在iOS 17脉冲符号效果不起作用的情况下制作UIBarButtonItem动画(没有UIImageView)

在SwiftUI中动态隐藏列表的空部分

如何在SwiftUI中顺时针和逆时针两个方向应用旋转效果?

如何在Android或iPhone上的原生react 中处理其他应用程序通知?

发生错误.请稍后重试.在 App Store 连接中

如何将 Info.plist 文件添加到 Xcode for admob,错误 添加后会产生多个命令

Strange UIView.animate更改UIButton标题 colored颜色 的行为

使用按位|带有布尔操作数

CGPath intersection(_:using:) 和朋友(iOS 16 中的新功能)坏了?

SwiftUI 中的偏移量和按钮有问题吗?

swiftUI中的剪辑形状无法使用旋转效果

滑动以返回特定的 SwiftUI 视图

将flutter android项目导入iOS

由于 NSInvalidUnarchiveOperationException 导致 iOS11 WKWebview 崩溃

标题为 UIImage 的导航栏

从 iOS/Android 上的 Web 应用调用本机日期 Select 器

在 UITableViewController 中使用 UISearchDisplayController 时断言失败

值/对象的 NSDictionary 键?