SwiftUI中如何约束自定义ModifiedContentView的泛型仅支持可响应font修饰的视图
方案1:仅支持Text类型
直接将泛型约束固定为Text类型即可,不符合的类型传入时编译器会直接报错:
struct ModifiedContentView: View { let content: Text init(@ViewBuilder content: () -> Text) { self.content = content() } var body: some View { content .font(.largeTitle) } }
这种方式最简单直接,如果你确定这个容器只需要承载Text视图,选这个方案就足够。
方案2:支持所有可响应
.font()修饰符的视图类型 因为SwiftUI官方没有提供内置协议标识视图是否支持字体修饰符,我们可以自定义协议来做类型约束,灵活控制允许传入的视图类型:
- 先定义约束协议
protocol FontApplicable: View {}
- 给所有支持字体生效的视图扩展遵循该协议
// 你可以根据业务需求扩展更多支持的类型 extension Text: FontApplicable {} extension TextField: FontApplicable {} extension Label: FontApplicable {} extension SecureField: FontApplicable {} extension TextEditor: FontApplicable {}
- 修改
ModifiedContentView的泛型约束
struct ModifiedContentView<Content: View & FontApplicable>: View { let content: Content init(@ViewBuilder content: () -> Content) { self.content = content() } var body: some View { content .font(.largeTitle) } }
这种方式灵活性更高,后续需要新增支持的视图类型,只需要给对应类型加一行扩展遵循FontApplicable协议即可,不支持的类型(比如Circle、Rectangle等形状视图)传入时会直接触发编译错误。
内容的提问来源于stack exchange,提问作者Yrb
相关产品推荐
相关产品推荐

