如何在SwiftUI中将.fontWeight添加为ViewModifier的一部分

如何在SwiftUI中将.fontWeight添加为ViewModifier的一部分,swiftui,Swiftui,我正在尝试创建ViewModifier来保存SwiftUI中的所有类型样式。尝试添加.fontWeight修改器时,出现以下错误: 类型“some View”的值没有成员“fontwweight” 这可能吗?在我的SwiftUI项目中,有没有更好的方法来管理类型样式 struct H1: ViewModifier { func body(content: Content) -> some View { content .foregroundC

我正在尝试创建ViewModifier来保存SwiftUI中的所有类型样式。尝试添加.fontWeight修改器时,出现以下错误:
类型“some View”的值没有成员“fontwweight”

这可能吗?在我的SwiftUI项目中,有没有更好的方法来管理类型样式

struct H1: ViewModifier {
    func body(content: Content) -> some View {
        content
            .foregroundColor(Color.black)
            .font(.system(size: 24))
            .fontWeight(.semibold)
    }
}

您可以通过在文本上的扩展中声明函数来实现这一点,如下所示:

extension Text {

    func h1() -> Text {
        self
            .foregroundColor(Color.black)
            .font(.system(size: 24))
            .fontWeight(.semibold)
    }
}
struct H1: ViewModifier {
    // system font, size 24 and semibold
    let font = Font.system(size: 24).weight(.semibold)

    func body(content: Content) -> some View {
        content
            .foregroundColor(Color.black)
            .font(font)
        }
} 
要使用它,只需调用:

Text("Whatever").h1()

像…这样的怎么样

extension Text {

    enum Style {
        case h1, h2 // etc
    }

    func style(_ style: Style) -> Text {
        switch style {
        case .h1:
            return 
             foregroundColor(.black)
            .font(.system(size: 24))
            .fontWeight(.semibold)
        case .h2:
            return 
             foregroundColor(.black)
            .font(.system(size: 20))
            .fontWeight(.medium)
        }
    }
}

然后你可以使用

Text("Hello, World!").style(.h1) // etc

字体的属性之一是
weight
,因此,您可以不将
fontwweight
应用于文本,而是将权重应用于字体,然后将字体添加到文本中,如下所示:

extension Text {

    func h1() -> Text {
        self
            .foregroundColor(Color.black)
            .font(.system(size: 24))
            .fontWeight(.semibold)
    }
}
struct H1: ViewModifier {
    // system font, size 24 and semibold
    let font = Font.system(size: 24).weight(.semibold)

    func body(content: Content) -> some View {
        content
            .foregroundColor(Color.black)
            .font(font)
        }
} 

钻取
fontWeight
表示此修饰符仅适用于
文本
。事实上,我也不知道这件事。这很烦人。我在形状视图中遇到了同样的问题。尚未找到解决方案:-(我尝试了各种类型的强制转换,但都没有成功。+1:我认为这是最好的解决方案,因为您不会试图通过避免使用ViewModifier来对抗SwiftUI架构。此外,您还可以将其用于任何“动态大小”字体,例如,我使用了
Font.largeTitle.weight(.semibold)字体
在我的应用程序中。难道没有办法要求
内容符合文本协议或类似协议吗?我考虑的是泛型类型。虽然选择的答案有效,但我认为这应该是正确的答案,因为它也使用类似于此解决方案的ViewModifier来解决答案!