«Тип выражения неоднозначен без дополнительного контекста» — обертка свойств в Swift и XCode 14

Я получаю сообщение об ошибке со следующим кодом в Swift. Код в порядке, если я не использую оболочку свойства. я получилType of expression is ambiguous without more contextв XCode 14.

      @propertyWrapper
public struct Clamping<Value: Comparable> {
    var value: Value
    let range: ClosedRange<Value>
    

    public init(wrappedValue value: Value, _ range: ClosedRange<Value>) {
        self.value = min(max(range.lowerBound, value), range.upperBound)
        self.range = range
    }

    public var wrappedValue: Value {
        get { value }
        set { value = min(max(range.lowerBound, newValue), range.upperBound) }
    }
}

var dragGesture: some Gesture {
    DragGesture()
        .onChanged { value in
            @Clamping(0...1) var progress: CGFloat = (120 + value.translation.width) / 120
            updateSampleView(progress: progress)
        }
}

func updateSampleView(progress:CGFloat) {
    print(progress)
}

1 ответ

Я считаю, что обертку свойства можно использовать только как переменную свойства, которая хранится как часть экземпляра определенного класса или структуры. Переменная внутри блока кода не является свойством, поэтому она не будет работать внутри onChanged().

Такой код, вероятно, то, что вы ищете:

      extension Comparable {
    func clamped(to range: ClosedRange<Self>) -> Self {
        return min(max(range.lowerBound, self), range.upperBound)
    }
}

Используйте это так:

      var progress: CGFloat = ((120 + value.translation.width) / 120).clamped(to: 0...1)
Другие вопросы по тегам