将绑定传递给类型属性包装器的变量 - 失去基础类型
Posted
技术标签:
【中文标题】将绑定传递给类型属性包装器的变量 - 失去基础类型【英文标题】:Passing binding to a variable of type property wrapper - loosing underlying type 【发布时间】:2021-03-06 11:24:57 【问题描述】:我正在尝试将绑定传递给使用属性包装器创建的变量。当我将绑定传递给另一个视图时,似乎我失去了对基础类型的访问权限。在下面的示例代码中,我演示了我可以更新原始绑定值,但当我将其绑定传递给另一个视图时不能:
import SwiftUI
@propertyWrapper
struct BoundedNumber
private var number: Int
private var minimum: Int
private var maximum: Int
init(wrappedValue: Int, minimum: Int, maximum: Int)
self.minimum = minimum
self.maximum = maximum
number = max(minimum, min(wrappedValue, maximum))
var wrappedValue: Int
get return number
set number = max(minimum, min(newValue, maximum))
struct ContentView: View
@State @BoundedNumber(minimum: 0, maximum: 10) var firstNumber: Int = 1
@State @BoundedNumber(minimum: 1, maximum: 5) var secondNumber: Int = 1
var body: some View
VStack
HStack
Text("\(firstNumber)")
UpdateButton($firstNumber, updateType: .decrement)
UpdateButton($firstNumber, updateType: .increment)
HStack
Text("\(secondNumber)")
UpdateButton($secondNumber, updateType: .decrement)
UpdateButton($secondNumber, updateType: .increment)
Button
firstNumber += 1 // This compiles
label:
Image(systemName: "plus")
struct UpdateButton: View
@Binding var value: BoundedNumber
let updateType: UpdateType
init(_ value: Binding<BoundedNumber>, updateType: UpdateType)
_value = value
self.updateType = updateType
enum UpdateType
case increment, decrement
var body: some View
Button
value += updateType == .increment ? 1 : -1
// This gives a compiler error:
// Binary operator '+=' cannot be applied to operands of type 'BoundedNumber' and '_'
label:
Image(systemName: updateType == .increment ? "plus" : "minus")
【问题讨论】:
value.wrappedValue += updateType == .increment ? 1 : -1
试试这个,BoundedNumber 是来自@State 的projectedValue
,类型为Binding<BoundedNumber>
,你所拥有的是直接访问你的包装结构,它是wrappedValue
属性是什么你需要。我不确定我是否完全正确,但为什么你需要这样一个嵌套包装器?
【参考方案1】:
使用运算符添加以下扩展名,您的代码就可以工作了。使用 Xcode 12.4 / ios 14.4 测试
extension BoundedNumber
static func +=(_ lhs: inout BoundedNumber, _ rhs: Int)
lhs.wrappedValue += rhs
【讨论】:
以上是关于将绑定传递给类型属性包装器的变量 - 失去基础类型的主要内容,如果未能解决你的问题,请参考以下文章
将 controlName 传递给另一个数组时,类型 any[] 上不存在属性控件名称?
传递给通用函数包装器(如 _.debounce)的函数的类型推断