Swift:@available在特定iOS版本及以下版本可用,但不适用于更高版本。

4

问题:

我想在 iOS 14 上使用 SwiftUI 中的 accessibilityIdentifier(),但其中一些代码支持 iOS 13+。

我能否继续使用与 iOS 14+ 版本相同的 API,在 iOS 13 上不执行任何操作?

例如:

/// How to make this available on pre-iOS 14 only?
extension View {
    func accessibilityIdentifier(_ identifier: String) -> some View {
        if #available(iOS 14.0, macOS 11.0, *) {
                .accessibilityIdentifier(identifier)
        } else {
            self
        }
    }
}

1个回答

2

一种可行的方法是创建自己的包装器,例如(已在 Xcode 13.2 中测试)

extension View {
    @ViewBuilder
    func accessibility(id identifier: String) -> some View {
        if #available(iOS 14.0, macOS 11.0, *) {
            self.accessibilityIdentifier(identifier)
        } else {
            self.accessibility(identifier: identifier)
        }
    }
}

是的,但这不会与原始API完全匹配。有没有办法使它匹配,以便在稍后的阶段我将完全删除它(在提高最低所需版本之后)? - Richard Topchii
你不能在调用中使用相同签名的函数,否则会导致循环。这里没有override,它不是面向对象编程的一部分,也没有super。这就是为什么需要新的函数签名来包装这些条件。 - Asperi
我能否在那里使用这个 ViewModifier 并调用它?https://dev59.com/Dm0NtIcB2Jgan1znFR71 这样我就不会回到同一个函数了吗?此外,我能否通过模块将这两个函数分开,例如 SwiftUI.View.accessibilityIdentifier 或类似的东西? - Richard Topchii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接