我是编程新手,今天我加入了StackOverflow.我希望我能根据指导方针提出以下问题:

我正在启动SwiftUI,它似乎有许多只能在iOS 17上运行的代码,看看这个:

if #available(iOS 17.0, *) {
    Text("Hello World")
        .font(.title.bold())
        .multilineTextAlignment(.leading)

        // This modifier only works on iOS 17
        .foregroundStyle(.red)
} else {
    Text("Hello World")
        .font(.title.bold())
        .multilineTextAlignment(.leading)

        .foregroundColor(.red)
}

我学到的第一件事是不要重复相同的代码,但我如何才能在不重复代码的情况下轻松地应用不同的修饰符?大概是这样的:

Text("Hello World")
    .font(.title.bold())
    .multilineTextAlignment(.leading)

  if #available(iOS 17.0, *) {
    .foregroundStyle(.red)
  } else {
    .foregroundColor(.red)
  }

附注:我见过posts like this实现了一个自定义修饰符,该修饰符接受bool作为输入,但它不能以编译器理解的方式接受操作系统版本.

Update

我知道我们可以为操作系统判断实现类似的结果,如下所示,但我正在以相同的一般方式寻找版本判断:

Text("Hello World")
    .font(.title.bold())
    .multilineTextAlignment(.leading)

  #if os(iOS)
    .foregroundStyle(.red)
  #else
    .foregroundColor(.red)

谢谢你考虑我的问题

推荐答案

通过一个简单的扩展,您可以达到相当于similar的效果:

extension View {
    func apply<V: View>(@ViewBuilder _ block: (Self) -> V) -> V { block(self) }
}

现在你可以像这样使用它:

Text("Hello World")
    .font(.title.bold())
    .multilineTextAlignment(.leading)
    .apply {
        if #available(iOS 15.0, *) {
            $0.foregroundStyle(.red)
        } else {
            $0.foregroundColor(.red)
        }
    }

请注意,你可以在任何你喜欢的视图上设置apply个修改器,这是非常通用的.

Ios相关问答推荐

SwiftUI拖动手势和内容拖动时的奇怪行为( skip /卡顿)

当重新呈现UI时,嵌套的 struct 值如何与@Observable一起工作?

TrueDepth摄像机像素距离不准确

当S没有身体时该如何处理

XcodeCloud生成失败,返回";ci_pre_xcodeBuild.sh是可执行文件,但退出时返回2个退出代码.";

如何防止UITest套件与Fastlane一起执行?

封装 Swift 导入

如何在Combine发布者之间强制执行最小延迟

NumberFormatter 无法使用 Xcode 15.0 beta 正确识别 iOS 17 beta 中的 Locale 货币设置

视图之间的 SwiftUI 过渡,没有过渡

Text() 正在添加额外的前导尾随填充 SwiftUI

如何在 Swift 中从另一个视图控制器将元素附加到数组中

无法同时满足约束 - 没有适当的约束

以编程方式获取故事板 ID?

为所有 UIImageViews 添加圆角

iOS UITextView 或 UILabel 带有可点击的动作链接

测试目标 X 遇到错误(提前意外退出,操作从未完成 bootstrap - 不会try 重新启动

比较没有时间分量的 NSDates

如何使用完成按钮制作 UIPickerView?

找不到开发者磁盘映像