我可以在 SwiftUI 中使用已弃用的函数吗

问题描述 投票:0回答:2

我正在使用 Xcode 14.0 以及 Swift 5.7 和 SwiftUI 开发 macOS 应用程序。我在 MacBook M1 Pro 上运行 macOS 12.6。 我需要至少支持 macOS 11.0,这意味着有许多新的 SwiftUI 功能我无法使用,因为它们需要 macOS 12.0+。 我在 SwiftUI 布局中经常使用的一个函数是 override(_:alignment:)。根据 Apple 文档,它已被弃用。 这很有趣,因为我仍然可以通过我描述的设置在我的代码中使用它。 但是,如果该功能在技术上已被弃用,那么部署时是否会破坏应用程序? 一般来说,苹果在向后兼容性方面并不是很好,而且在您的应用程序崩溃或被应用程序商店拒绝之前,也很难找到有关向后兼容性的信息。 如前所述,我无法使用建议的覆盖(对齐:内容:),因为它需要 macOS 12.0+。

也许我应该放弃 macOS 11 并需要 macOS 12,因为已经过去了几年,但根据 2021 年进行的一项调查,我了解到很多用户 (>70%) 仍在运行 macOS 11。也许现在情况有所不同macOS 13 已经发布了。

enter image description here

swift macos swiftui macos-catalina
2个回答
5
投票

继续使用已弃用的

overlay
版本是安全的。 Apple 多年来不会将其从 SwiftUI 中删除(如果有的话)。

但是如果您想更加安全,您可以编写自己的修改器,如果新的

overlay
不可用,则使用已弃用的
overlay

extension View {
    @ViewBuilder
    func overlayWorkaround<V: View>(
        alignment: Alignment = .center,
        @ViewBuilder _ content: () -> V
    ) -> some View {
        if #available(macOS 12, macCatalyst 15, iOS 15, tvOS 15, watchOS 8, *) {
            self.overlay(alignment: alignment, content: content)
        } else {
            self.overlay(content(), alignment: alignment)
        }
    }
}

0
投票

并非绝对有必要更改旧代码以符合此弃用。正如 @robmayoff 在他的回答中所说的那样,已弃用的版本(可能)不会被删除。 我无法用官方声明来支持这一点,但在我看来,这个修饰符的改变只不过是代码可读性和 API 一致性的更新。

为了说明这一点,我添加了以下示例。您可以看到,将

alignment
作为第二个属性使得在代码中更难找到,而使用 new 时,它可以很好地位于修饰符的开头,并且后面可以跟一个包含

content
的尾随闭包。

overlay(_:alignment:)

用法:

someView
    .overlay({
        
        // lots of view code lines ...
        
    }, alignment: .leading)

overlay(alignment:content:)

用法:

someView
    .overlay(alignment: .leading) {
        
        // lots of view code lines ...
        
    }

	
© www.soinside.com 2019 - 2024. All rights reserved.