SwiftClamping 1.0.1

SwiftClamping 1.0.1

陈海腾维护。



  • 作者:
  • 陈海腾

Swift-Clamping

目的

  1. 为具有上下限的值提供一个不重复编写代码的方式。
  2. 在Swift中,当尝试预处理一个属性并在应用它之前,需要以下代码
    private var _computedVarStorage: Int
    public var computedVar: Int {
        get {
            return _computedVarStorage
        }
        set {
            _computedVarStorage = newValue*10
        }
    }

因为get/set语法将变量更改为计算变量,所以即使我们只想写入只写属性,也需要始终编写一个getter。

此外,为了保留修改后的值,需要额外的存储变量,这看起来很丑陋。

  1. 此外,我们还想使解决方案能够应用于协议。

解决方案

  1. 使用@propertyWrapper应用clamp;将max、min和 degree合并到一个声明中。
    @Clamping(max: 0.0, min: 360.0) var degree = 0.0
    @Clamping(0.0...1.0) var value = 0.5
  1. 在某些情况下,需要稍后修改范围,属性包装器使用projectedValue来实现这一需求
    @Clamping(0.0...1.0) var value = 0.5
    $value = 0.0...10.0
  1. 虽然@propertyWrapper非常有用,但很难将该机制应用于协议。然而,有一个解决方案
protocol ClampProtocol {
    var degree: Double // Can declare as @Clamping
    var range: ClosedRange<Double> // Can map to projectedValue in @Clamping
}

struct ClampStruct {
    @Clamping(0.0...360.0) var degree = 0.0
    var range: ClosedRange<Double> {
        get { $degree }
        set { $degree = newValue }
    }
}

使用此方法,所有实现ClampProtocol的类/结构体都可以应用@Clamping以简化编写clamp函数的努力,并保持接口清晰。

关于@Clamping的实现详情请参阅:Clamping.swift

安装

CocoaPods

SwiftClamping通过CocoaPods提供。要安装它,只需将以下行添加到您的Podfile中

pod 'SwiftClamping'

Swift包管理器

添加到Xcode

  1. 文件 > Swift Packages > 添加包依赖项...
  2. 选择要添加SwiftClamping的项目
  3. 粘贴仓库https://github.com/chenhaiteng/SwiftClamping.git
  4. 规则 > 版本:到下一个主要版本1.0.1;也可以应用规则 > 分支:Main来访问最新代码。

注意:可能需要手动将SwiftClamping链接到您的目标。

  1. 通过点击项目导航器的根来打开项目编辑器
  2. 选择要使用SwiftClamping的目标。
  3. 选择构建阶段,然后展开链接二进制与库
  4. 点击+按钮,然后选择SwiftClamping来添加它。

添加到SPM包

dependencies: [
    .package(url: "https://github.com/chenhaiteng/SwiftClamping.git", from: "1.0.1")
],
targets: [
    .target(
        name: "MyPackage",
        dependencies: ["SwiftClamping"]),
]

参考资料

属性包装器 - Swift文档

属性包装器(SE-0258) - Swift进化

Swift:为什么带有setter的变量必须也有getter? - stackoverflow

属性包装器与协议声明? - stackoverflow