微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将绑定传递给属性包装器类型的变量 - 丢失底层类型

如何解决将绑定传递给属性包装器类型的变量 - 丢失底层类型

我正在尝试将绑定传递到使用属性包装器创建的变量。当我将绑定传递给另一个视图时,我似乎失去了对基础类型的访问权限。在下面的示例代码中,我演示了我可以更新原始绑定值,但当我将其绑定传递给另一个视图时不能:

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")
        }
    }
}

解决方法

使用运算符添加以下扩展名,您的代码就可以工作了。使用 Xcode 12.4 / iOS 14.4 测试

extension BoundedNumber {
    static func +=(_ lhs: inout BoundedNumber,_ rhs: Int) {
        lhs.wrappedValue += rhs
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。