我希望做以下工作:

import SwiftUI

protocol CombinedView: View {
    var dataForViewA: String { get }
    var viewA: any View { get }
    var viewB: any View { get }
}

extension CombinedView {
    var viewA: Text {
        Text(dataForViewA)
    }
    
    var body: some View {
        VStack {
            viewA
            viewB
        }
    }
}

viewA工作正常,因为我可以指定具体类型,但var body抱怨:

Type 'any View' cannot conform to 'View'

我不确定我需要实施什么来解决这个问题.有什么 idea 吗?

提前感谢您的建议

推荐答案

它不是这样工作的,相反,我们需要每个泛型视图的相关类型和扩展的专业化.

这是固定变量.使用Xcode 14b3/iOS 16测试

protocol CombinedView: View {
    associatedtype AView: View
    associatedtype BView: View

    var dataForViewA: String { get }

    var viewA: Self.AView { get }
    var viewB: Self.BView { get }
}

extension CombinedView {
    var body: some View {
        VStack {
            viewA
            viewB
        }
    }
}

extension CombinedView where AView == Text {
    var viewA: Text {
        Text(dataForViewA)
    }
}

Test module on GitHub

Swift相关问答推荐

SwiftData:线程1:&Quot;NSFetchRequest找不到实体名称';提醒&q;的NSEntityDescription

声明一个协议时使用和不使用任何单词有什么区别?

如何使泡泡上的箭头直达封闭矩形

正在接收具有不完整数据错误的URL请求

在 SwiftUI 中禁用 Select 器选项

如何判断一个值是否为 Int 类型

如何测试可选 struct 的协议一致性

获取具有关联类型的协议的self

SwiftUI - Select 器没有 Select 值

创建 ViewModel 时 iOS 模拟器上的黑屏

响应 UITextField (UIViewRepresentable) 中的特定按键

符合协议 - 错误?

令人满意的 var body:协议扩展中的一些视图

对齐时如何避免图像尺寸缩小

如何更改 Picker 的边框 colored颜色

为什么 switch 在 optional 中不接受 case nil?

如何在 SwiftUI 中实现 PageView?

swift 3 错误:参数标签 '(_:)' 不匹配任何可用的重载

如何在 GCD 中停止 DispatchWorkItem?

如何使用 Swift 枚举作为字典键? (符合 Equatable)