【问题标题】:Swift and Binding shorthandSwift 和 Binding 速记
【发布时间】:2022-09-27 17:18:09
【问题描述】:
let _ = Binding(get: { x }, set: { x = $0 })

当你有更复杂的 getter 和 setter 时,似乎很长。我想知道是否有更简单的方法。我确实知道@focusState,但让我们暂时忘记它。

让我们尝试一些东西..

public protocol FocusEnum: Equatable {

    //func binding(_ equals: Self) -> Binding<Bool>
    
}

extension Optional where Wrapped: FocusEnum {
    
    func binding(_ equals: Self) -> Binding<Bool> {
        Binding(get: { self == equals }, set: { self = $0 ? equals: nil })
    }
}

这行不通,self 是不可变的。如果我将其更改为 mutable func- no go,那么闭包将捕获 inout 参数...

这将非常方便..

enum focusEnum: FocusEnum {
        case field1
        case field2
}

...


@State var focused: focusEnum? = nil

并获得绑定.. let _ = focused.binding(.field1)

有任何想法吗?

  • 错误说明了一切,它是不可变的。根据定义,绑定是双向连接。你在连接什么?
  • 到符合 FocusEnum 协议的可选枚举。

标签: swift swiftui binding


【解决方案1】:

我无法让它工作。太糟糕了,能做就太好了自动的通过添加协议一致性。

我绕过它并将其添加到 View 以获得相同的结果..

func focusField(equals: FieldId) -> Binding<Bool> {
    Binding(get: { focused == equals ? true : false }, set: { focused = $0 ? equals : nil })
}

我有一个布尔焦点协议添加 isFocused(_ binding: Binding&lt;Bool&gt;) -&gt; Self 我的意见来自UIViewRepresantable需要特别注意焦点处理,主要是我们谈论UITextField在这里。

【讨论】:

    猜你喜欢
    • 2021-09-26
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多