The Swift Package Index logo.Swift Package Index

追踪 Swift 6 严格并发检查的数据竞争安全性采用情况。有多少个 Package 为 Swift 6 准备就绪

当使用 Xcode 项目时

当使用 Swift Package Manager 清单时

选择 Package 版本

0.1.0

main


将新的 @Invalidating 属性包装器反向移植到旧平台




ViewInvalidating

一个属性包装器,用于将新的 @Invalidating 属性包装器向后移植到旧版本的 iOS/tvOS/macOS。有关此新属性包装器的更多信息,请参阅 WWDC 2021 演讲 “AppKit 的新增功能” 以获得简要介绍。

语法和类型与 Apple 的做法非常相似,因此当最终需要将项目的部署目标更新到 iOS 15+/tvOS 15+/macOS 12+ 时,您可以通过进行非常小的更改轻松迁移到使用 Apple 的版本。请参阅迁移部分了解更多信息!

用法

使用 @ViewInvalidating 注释您的 Equatable 属性,并提供选项,这些选项将在属性值更改时用于使视图失效

final class MyView: UIView {
  // Calls setNeedsLayout()
  @ViewInvalidating(.layout) var cornerRadius: CGFloat = 12.0
  
  // Calls setNeedsLayout() then setNeedsUpdateConstraints()
  @ViewInvalidating(.layout, .constraints) var heightConstraintValue: CFloat = 200.0
  
  // Calls setNeedsLayout() then setNeedsUpdateConstraints() then invalidateIntrinsicContentSize()
  @ViewInvalidating(.layout, .constraints, .intrinsicContentSize) var magicProperty: CGFloat = 1234.0

您可以使用最多 10 个选项初始化属性包装器。当然,您可以添加扩展来支持更多选项,但实际上您可能永远不需要传递超过几个选项!

默认情况下,每个平台总共支持 5 个失效选项

通用

  • 布局
  • 显示
  • 约束
  • 固有尺寸

仅 macOS

  • 可恢复状态

仅 iOS 14+

  • 配置

添加自定义失效器

您可以通过创建符合 UIViewInvalidatingTypeNSViewInvalidatingType 协议(取决于目标平台)的类型并实现 invalidate 方法要求来添加自定义失效器

extension Invalidations {
  struct Focus: UIViewInvalidatingType {
    static let focus: Self = .init()

    func invalidate(view: UIView) {
      view.setNeedsFocusUpdate()
    }
  }
}

然后,您可以通过扩展 InvalidatingStaticMember 类型将其公开给属性包装器

extension InvalidatingStaticMember where Base: UIViewInvalidatingType {
  static var focus: InvalidatingStaticMember<Invalidations.Focus> { .init(.focus) }
}

注意

如果您使用的是 Xcode 13,则应改为这样做

extension UIViewInvalidatingType where Self == Invalidations.Focus {
 static var focus: Self { .focus }
}

InvalidatingStaticMember 类型的存在只是为了解决 Swift 5.5 中已解决的一些语言限制,Swift 5.5 随 Xcode 13 一起发布。因此,如果您使用的是最新的 Xcode,则无需使用此解决方法。InvalidatingStaticMember 也将不可用。

然后您可以在 @ViewInvalidating 上使用新的失效器

final class MyView: UIView {

  // Calls setNeedsLayout() and Focus.invalidate(self)
  @ViewInvalidating(.layout, .focus) var customProperty: CGFloat = 1.0
}

要求

  • iOS 11+、tvOS 11+ 或 macOS 10.11+ 的部署目标
  • Xcode 11 或更高版本

安装

将以下内容添加到项目的 Package.swift 文件中

.package(url: "https://github.com/theblixguy/Invalidating", from: "0.1.0")

或通过 Xcode UI 添加此包,方法是转到 File > Swift Packages > Add Package Dependency。

迁移到 iOS 15+/tvOS 15+/macOS 12+ 部署目标

当需要将项目的部署目标更新到 iOS 15+/tvOS 15+/macOS 12+ 时,您将需要对代码进行一些非常小的更改,以使其与 Apple 的 @Invalidating 和相关类型兼容。

此包附带的类型已使用 @available 注释,并在其 renamed 参数中包含与 Apple 类型的正确映射,以便您非常轻松地更新代码。更新部署目标后,您将看到一些错误

Migration Fix-it Migration Fix-it

正如您所看到的,它们都提供了一个修复程序来自动更改类型名称。单击一个按钮,错误就会消失,而您甚至不必手动重命名它们

Migration Fix-it Migration Fix-it

许可证

MIT License

Copyright (c) 2021 Suyash Srijan

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.