gpt4 book ai didi

ios - 在 SwiftUI 中创建 ViewModifier 和 View 扩展的区别

转载 作者:行者123 更新时间:2023-12-03 17:42:04 25 4
gpt4 key购买 nike

我试图找出这两种方法之间的实际区别。例如:

struct PrimaryLabel: ViewModifier {
func body(content: Content) -> some View {
content
.padding()
.background(Color.black)
.foregroundColor(Color.white)
.font(.largeTitle)
.cornerRadius(10)
}
}

extension View {
func makePrimaryLabel() -> some View {
self
.padding()
.background(Color.black)
.foregroundColor(Color.white)
.font(.largeTitle)
.cornerRadius(10)
}
}

然后我们可以通过以下方式使用它们:
Text(tech.title)
.modifier(PrimaryLabel())
Text(tech.title)
.makePrimaryLabel()
ModifiedContent(
content: Text(tech.title),
modifier: PrimaryLabel()
)

最佳答案

你提到的所有方法都是正确的。不同之处在于您如何使用它以及在哪里访问它。 哪一个更好? 是一个基于意见的问题,您应该查看干净的代码策略和 SOLID 原则等,以找到每种情况的最佳实践。

SwiftUI是非常修饰链的基础,第二个选项是最接近原始修饰符的。你也可以像原件一样采用参数:

extension Text {
enum Kind {
case primary
case secondary
}

func style(_ kind: Kind) -> some View {

switch kind {
case .primary:
return self
.padding()
.background(Color.black)
.foregroundColor(Color.white)
.font(.largeTitle)
.cornerRadius(10)

case .secondary:
return self
.padding()
.background(Color.blue)
.foregroundColor(Color.red)
.font(.largeTitle)
.cornerRadius(20)
}
}
}

struct ContentView: View {
@State var kind = Text.Kind.primary

var body: some View {
VStack {
Text("Primary")
.style(kind)
Button(action: {
self.kind = .secondary
}) {
Text("Change me to secondary")
}
}
}
}

我们应该拭目以待 贝斯特像这样的新技术的实践。我们现在找到的任何东西都只是 实践。

关于ios - 在 SwiftUI 中创建 ViewModifier 和 View 扩展的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57411656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com