- 为具有上下限的值提供一个不重复编写代码的方式。
- 在Swift中,当尝试预处理一个属性并在应用它之前,需要以下代码
private var _computedVarStorage: Int
public var computedVar: Int {
get {
return _computedVarStorage
}
set {
_computedVarStorage = newValue*10
}
}
因为get/set语法将变量更改为计算变量,所以即使我们只想写入只写属性,也需要始终编写一个getter。
此外,为了保留修改后的值,需要额外的存储变量,这看起来很丑陋。
- 此外,我们还想使解决方案能够应用于协议。
- 使用@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
- 在某些情况下,需要稍后修改范围,属性包装器使用projectedValue来实现这一需求
@Clamping(0.0...1.0) var value = 0.5
$value = 0.0...10.0
- 虽然@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
SwiftClamping通过CocoaPods提供。要安装它,只需将以下行添加到您的Podfile中
pod 'SwiftClamping'
- 文件 > Swift Packages > 添加包依赖项...
- 选择要添加SwiftClamping的项目
- 粘贴仓库https://github.com/chenhaiteng/SwiftClamping.git
- 规则 > 版本:到下一个主要版本1.0.1;也可以应用规则 > 分支:Main来访问最新代码。
注意:可能需要手动将SwiftClamping链接到您的目标。
- 通过点击项目导航器的根来打开项目编辑器。
- 选择要使用SwiftClamping的目标。
- 选择构建阶段,然后展开链接二进制与库
- 点击+按钮,然后选择SwiftClamping来添加它。
dependencies: [
.package(url: "https://github.com/chenhaiteng/SwiftClamping.git", from: "1.0.1")
],
targets: [
.target(
name: "MyPackage",
dependencies: ["SwiftClamping"]),
]
Swift:为什么带有setter的变量必须也有getter? - stackoverflow