首页 > 解决方案 > 是否可以在新的 init 中实现对 Swift (SwiftUI) 类的通用约束?

问题描述

虽然下面的示例很简单,但它无法编译,因为 Swift 无法确定 Text() 视图是泛型约束所需的内容类型(错误“无法将'Text'类型的值转换为闭包结果类型'Content'” )。

有没有办法让 init 可以满足通用约束?

extension VStack {
    init() {
        self.init(spacing: 0) {
            Text("Test")
        }
    } 
}

完整的示例,在更新了 George_E 的回复后,如下所示。

extension VStack {
    init<InnerContent: View>(alignment: HorizontalAlignment = .center, spacing: CGFloat? = nil, @ViewBuilder content: @escaping (GeometryProxy) -> InnerContent) where Content == GeometryReader<InnerContent> {
        self.init(alignment: alignment, spacing: spacing) {
            GeometryReader { proxy in
                content(proxy)
            }
        }
    }
}

标签: swiftgenericsswiftui

解决方案


您可以where在 init 中包含一个子句:

extension VStack {
    init() where Content == Text {
        self.init(spacing: 0) {
            Text("Test")
        }
    }
}

或者:

extension VStack where Content == Text {
    init() {
        self.init(spacing: 0) {
            Text("Test")
        }
    }
}

推荐阅读