swift - 令人满意的var body : some View in protocol extension

标签 swift swiftui

我希望执行以下操作:

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'

我不确定需要采取什么措施来解决这个问题。有什么想法吗?

预先感谢您的任何建议

最佳答案

它不是这样工作的,相反,我们需要为每个通用 View 关联类型并在扩展中进行专门化。

这是固定变体。使用 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 - 令人满意的var body : some View in protocol extension,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73147046/

相关文章:

SwiftUI 居中对齐 View ,除非另一个 View "pushes"将其向上

swift - 通过 RightBarButtonItem 移动到另一个 Viewcontroller

ios - Int 和 int 不可转换为 Int -(返回 2 个数组,UITableView)

ios - 如何在 Swift 中将此 var 字符串转换为 URL

swift - 设置连续轮式选取器 - SwiftUI

ios - 在 View 中初始化 @ObservedObject 时发生内存泄漏

ios - 忽略 SwiftUI Color 或 View 增加的配色方案对比度

swiftui - 如何对不同的形状使用相同的修饰符集

ios - UITableViewController 加载方法的逻辑顺序是什么?

swift - 在 SwiftUI 中的 ForEach 中使用 id 时,如何对数组的索引进行动画处理